Set up warmup, launch cold email campaigns, and run LinkedIn and Instagram outreach — with safe sending limits and inbox placement built in.
Complete documentation for WarmySender. Setup guides, troubleshooting, and help resources for email warmup, cold email campaigns, LinkedIn automation, and more.
Welcome to WarmySender! Follow these steps to get up and running:
Connect your first mailbox — Go to Mailboxes, click 'Add Mailbox', and enter your IMAP/SMTP credentials. For Gmail and Outlook, you need an App Password (see Provider Setup Guides below).
Enable warmup — Once connected, go to Warmup and enable it for your mailbox. The system will start sending and receiving warmup emails automatically to build your sender reputation.
Wait 2-3 weeks — Let warmup run to establish a healthy reputation. Monitor your Health Score (aim for 70+) and Inbox Rate (aim for 80%+) on the Warmup dashboard.
Set up DNS records — While warming up, configure SPF, DKIM, and DMARC records for your sending domain. This is critical for inbox placement.
Create your first campaign — Once your health score is above 70, go to Campaigns and create your first email sequence. Start with a small daily sending limit (20-30 emails/day) and increase gradually.
Monitor results — Use Analytics to track open rates (aim for 40%+), reply rates (aim for 5%+), and bounce rates (keep below 3%). Check your Unified Inbox for replies.
Tip: Complete the in-app product tour for a guided walkthrough. You can replay it anytime from Settings > Account > Product Tour.
Connect your mailbox once, switch on warmup, and let an AI assistant run everything else — your cold email campaigns, your LinkedIn outreach, and your Instagram DMs — just by asking in plain English. WarmySender speaks MCP (the Model Context Protocol, the open standard that lets AI tools take real actions inside your account), so the AI you already use can set up and run your outreach for you. Here is the one thing you do yourself, and how to hand the rest to any AI.
The One Thing That Stays In The App Two setup steps stay with you, because they touch your real inboxes: 1) Connect your mailbox(es). Open Mailboxes > Add Mailbox and connect Gmail, Outlook / Microsoft 365, or any IMAP/SMTP inbox. Full walkthrough: /documentation/connecting-mailbox. 2) Turn on warmup. Enable warmup on each mailbox so your sender reputation is quietly built and protected before you scale up. See the warmup guides in this help center (start with 'How Email Warmup Works'). That is it. Once your inboxes are connected and warming, everything else can be driven by an AI agent — no dashboards, no copy-paste.
Then Automate Everything — Across All Three Channels After setup you simply talk to your AI assistant and it calls the right WarmySender action for you. Real examples you can paste today:
Cold email campaigns • 'Create a 3-step cold email campaign called Q3 Founders, enroll these 40 leads, and launch it.' • 'Add these 200 prospects, skip duplicates, and enroll them in my Onboarding sequence.' • 'Pause the campaign that is getting bounces and show me its reply rate.'
LinkedIn outreach • 'Start a LinkedIn connection campaign to these prospects at a safe pace.' • 'Enroll this audience in my LinkedIn follow-up campaign and show me the acceptance rate so far.' • 'Publish this LinkedIn post for me.'
Instagram DMs • 'Create an Instagram DM campaign and enroll this audience.' • 'How is my Instagram campaign doing — how many DMs went out today?'
You can even mix channels in one sentence: 'Build a multichannel sequence — connect on LinkedIn first, then email the people who accept.'
Works With Any AI — Not Just Claude Because MCP is an open standard, WarmySender plugs into any MCP-compatible AI client, including: • Claude Desktop and Claude Code • ChatGPT and Codex (OpenAI) • Cursor, Windsurf, and Zed • Perplexity • Any other tool that speaks MCP Step-by-step install snippets for each client live in the MCP install guide (/documentation/mcp-install) and on the AI Agents page (/ai-agents). If you use Claude, the fastest route is the one-click connector — see /documentation/connect-warmysender-to-claude — with no config files and no key to paste.
How To Connect (about 2 minutes) Pick whichever suits your tool: • API key (works everywhere): Open Settings > API Keys and create a key (it starts with ws_), or generate one on the AI Agents page (/ai-agents). Point your AI client at the WarmySender endpoint — https://warmysender.com/mcp — and paste the key. Per-client snippets: /documentation/mcp-install. • One-click for Claude: Use the Claude connector to authorize in a single click, no key to copy. See /documentation/connect-warmysender-to-claude. AI automation is included with any paid WarmySender plan — there is no separate charge.
Is It Safe? Yes — Here Is Why Handing an AI the wheel sounds risky, so the safety is built into the foundation: • The AI never sends anything directly. Every outreach action is queued, and our scheduler paces it within your gradual ramp-up and your per-account daily and weekly limits — exactly as if you ran it by hand. An AI cannot burst-send or push past a cap, even if it tries. • The AI cannot connect or disconnect accounts, and cannot permanently delete anything. Those actions stay in the app behind your login, so a confused or misused AI cannot drain your seats or wipe your data. • Everything is scoped to your workspace only, and you can revoke any key instantly from Settings > API Keys. There are 60 tools available — across email, LinkedIn, Instagram, warmup, verification, tracking domains, and your leads database — and every one is safety-checked. Account safety always wins over speed.
Frequently Asked Questions
Do I still need to connect my mailbox myself? Yes — just once. Connecting your inbox and turning on warmup are the only steps that stay in the app, because they involve your real email accounts. After that, an AI can drive the rest. See /documentation/connecting-mailbox.
Can it run LinkedIn and Instagram too, or only email? All three. The same AI assistant can create and launch cold email campaigns, LinkedIn connection and message campaigns, and Instagram DM campaigns, then report back on how each one is performing.
Is it safe — could the AI get my account banned? No. The AI only queues the work; our scheduler decides when each invite, message, or email actually goes out, always within your ramp and your daily and weekly caps. It never sends directly and can never raise a limit, so your accounts stay inside safe boundaries.
Which AI tools work? Any MCP-compatible client — Claude Desktop, Claude Code, ChatGPT, Codex, Cursor, Windsurf, Zed, Perplexity, and more. Install steps: /documentation/mcp-install and /ai-agents.
Is there an extra cost? No. AI automation over MCP is included with any active paid plan. Your usage simply counts toward the normal fair-use rate limits.
Next steps: connect a mailbox (/documentation/connecting-mailbox) and start warmup, then connect your AI (/documentation/connect-your-ai-agent), skim the MCP overview (/documentation/mcp-overview) and the install guide (/documentation/mcp-install). Brand new to outreach? The 15-minute Quick Start (/documentation/quick-start-campaign) and Getting Started (/documentation/getting-started) cover the basics.
The fastest way to get your bearings in WarmySender is the 60-second guided tour. It walks you through every part of the app and introduces the four things WarmySender does best: Cold Emailing (build multi-step email campaigns that send gradually and stop the moment someone replies — the #1 use case), Email Warmup (quietly builds and protects your sender reputation so emails land in the inbox, not spam), LinkedIn Outreach (connection requests and follow-up messages at a safe, natural pace), and Multichannel (mix email, LinkedIn, and Instagram DMs into one sequence).
Take the tour: The first time you sign in, a Welcome screen appears with a 'Take the 60-second tour' button. Click it and the tour spotlights each area of the app one step at a time — dashboard, mailboxes, warmup, prospects, find & verify emails, campaigns, templates, LinkedIn, Instagram, the unified inbox, analytics, and AI Agents — with a short note about what each does. Use Next, Back, or Skip at any point. The tour is optional and read-only; taking it never changes anything in your account.
Replay it anytime: Click the 'Tour' button (sparkles icon) in the top header of the app, or open Settings and start the tour from there. Many individual pages also show their own short tour the first time you visit them, so help appears right where you need it as you explore.
In your language: WarmySender is available in 10 languages, and the app — including the guided tour — follows your chosen language. Set it in Settings.
Full walkthrough with screenshots of every area: see the Getting started: take the WarmySender product tour guide at /documentation/getting-started-product-tour.
Select your email provider (Gmail, Outlook, Hostinger, Zoho, etc.) or choose Custom IMAP/SMTP.
Enter your full email address as the username.
Enter your password — for Gmail and Outlook, you must use an App Password (not your regular password). For Hostinger, use your regular email password. See the Provider Setup Guides below for provider-specific instructions.
The SMTP and IMAP server settings will auto-fill based on your provider. Verify them against the Provider Setup Guides if you have a custom setup.
Click 'Test Connection' to verify everything works before saving.
Once connected, your mailbox will show a green 'Connected' status.
You can connect multiple mailboxes to your workspace. Each mailbox can be assigned to campaigns independently. Connected mailbox limits by tier: Pro 50, Enterprise 400, Ultimate 800 mailboxes per account. Free plan includes 1 mailbox, Lite includes 3.
If connection fails, check the Troubleshooting section below for common errors like 'Authentication failed' or 'Connection refused'.
A detailed comparison of all WarmySender subscription plans to help you choose the right one.
Plan Overview (monthly billing):
Pro — $14.99/month (most popular, includes 7-day free trial)
Enterprise — $69.99/month (for agencies and high-volume senders)
Ultimate — $199/month (for power users running massive multi-account outreach)
Note: the Business plan is no longer available to new customers — existing Business customers keep their plan and pricing.
Annual Billing (save 55% — limited time):
Pro — $6.74/month ($80.88/year)
Enterprise — $31.49/month ($377.88/year)
Ultimate — $89.55/month ($1,074.60/year)
How the limited-time 55% annual offer works:
The 55% discount is evergreen but framed with a real end-of-month deadline that resets monthly — so the urgency is real (the date you see is the actual end of this calendar month UTC) but the discount itself does not actually disappear when the date hits.
Customers already on a previous annual rate keep their original price — they are grandfathered at the rate they signed up for and renew at that same rate until they cancel or switch tiers.
Promo codes can stack on top of the 55% (so a 10% off code at checkout makes the total ~59.5% off list price).
LinkedIn seats are billed separately — $15/seat/month, or $120/seat/year (33% off) on annual billing (seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price).
Monthly Email Quota:
Pro: 10,000 emails/month (≈333/day)
Enterprise: 100,000 emails/month (≈3,333/day)
Ultimate: 300,000 emails/month (≈10,000/day)
Connected Mailboxes (account-wide, across all your workspaces):
Pro: 50 mailboxes
Enterprise: 400 mailboxes
Ultimate: 800 mailboxes
Free tier: 2 mailboxes
Email Warmup:
Included on ALL paid plans at no extra cost
Uses the A.H.D.E. (Adaptive Health-Driven Engine) algorithm
Warm up every mailbox you connect (up to your plan's mailbox cap) — there is no per-mailbox fee
Team Members (Seats):
Pro: 2 members (you as the owner + 1 invited team member)
Enterprise: 4 members (you + 3 invited)
Ultimate: 15 members (you + 14 invited)
Each member gets their own login and can access mailboxes, campaigns, and analytics within the workspace
B2B Lead Database (monthly allowance, resets on your billing anniversary):
Pro: 1,000 leads/month
Enterprise: 15,000 leads/month
Ultimate: 30,000 leads/month
Your monthly allowance is paced across the month (about the monthly total ÷ 30 each day). Need more on a given day? Lead credits never expire and cover the overflow instantly.
1 lead = 1 new save or export; browsing is free (emails are shown masked until you save a lead)
Search 200M+ verified B2B contacts across the US and Canada
Email Verifications (free monthly allowance, resets each billing cycle):
Pro: 300 verifications/month
Enterprise: 1,500 verifications/month
Ultimate: 10,000 verifications/month
Each plan also has a daily allowance equal to its monthly total ÷ 30 (about 10/day on Pro, 50/day on Enterprise, 333/day on Ultimate); Unknown results are free and don't count against either allowance
These numbers are a free allowance, not a ceiling. Need more? One-time verification credit packs verify beyond your plan's monthly allowance — verification credits never expire, skip the daily pace, and are used automatically only once the free allowance runs out.
Prospect Storage:
Pro: 10,000 prospects
Enterprise: 100,000 prospects
Ultimate: 300,000 prospects
Workspaces:
Pro: 1 workspace
Enterprise: Up to 5 workspaces
Ultimate: Up to 10 workspaces
Each workspace is isolated with its own mailboxes, campaigns, prospects, and settings
LinkedIn Add-On (available on any paid plan):
$15/seat/month per workspace, or $120/seat/year (33% off) on annual billing (seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price)
Each seat = one connected LinkedIn account
Includes multi-step LinkedIn campaigns, post publishing, and analytics
Billed separately from your main subscription
Features Included on ALL Paid Plans:
Email warmup (A.H.D.E.)
Multi-step email sequences
A-Z testing (up to 26 subject line and body variants)
Conditional branching
Multi-account LinkedIn sender rotation (round robin) — attach multiple connected LinkedIn accounts to one campaign so each lead is reached by only one account (each account needs its own $15/month LinkedIn seat)
Spam score checker
Unified inbox
Analytics (open, click, reply tracking)
Bounce Shield protection
Custom tracking domains
Webhooks and API access
Team collaboration
Enterprise & Ultimate:
Dedicated support (vs. Priority support on Pro)
Best suited for agencies managing multiple clients
How to Choose:
Solo founder or consultant? → Pro ($14.99/mo) covers most use cases
Agency or high-volume sender? → Enterprise ($69.99/mo)
Power user running massive multi-account outreach (300K emails/mo, 30K leads/mo, 15-person team)? → Ultimate ($199/mo)
Not sure? Start with the Pro 7-day free trial (no credit card required) and upgrade anytime
Email verifier unlocks when you start a paid plan (300/month on Pro)
Unified inbox, analytics, and all other Pro features
How to Start Your Trial:
Sign up at warmysender.com
Click 'Start 7-Day Free Trial' on the Pro plan
No credit card needed — you get instant access
Start connecting mailboxes and setting up warmup immediately
During Your Trial:
A blue banner shows how many days remain
3 days before expiry, you will receive an email reminder
You can upgrade to a paid plan at any time during the trial
What Happens When the Trial Ends:
If you do NOT subscribe: Your account is automatically downgraded to a restricted state. You can still log in but can only access the Billing page to subscribe. Active campaigns and warmup are paused.
If you DO subscribe before the trial ends: Your account seamlessly transitions to the paid plan with no interruption. All your mailboxes, campaigns, and data are preserved.
After Trial Expiry — How to Re-Activate:
Log in to your WarmySender account
You will be redirected to the Billing page
Choose a plan (Pro, Enterprise, or Ultimate) and subscribe
Your account is immediately re-activated with all your data intact
Paused campaigns and warmup can be resumed
Trial Limits:
One free trial per workspace
Disposable/temporary email addresses are not accepted for trial sign-up
The trial is only available on the Pro plan ($14.99/month after trial)
Upgrading During Trial:
You can upgrade to Enterprise or Ultimate at any time during your trial
Upgrading starts your paid subscription immediately
No charge for the trial period — billing begins at the upgrade date
Get your first email campaign running in 15 minutes with this condensed guide.
Minute 1-3: Connect Your Mailbox Go to Mailboxes > Add Mailbox. Select your provider (Gmail, Outlook, etc.) and enter your credentials. For Gmail/Outlook, use an App Password — see Provider Setup Guides below for instructions.
Minute 4-6: Add Prospects Go to Prospects > Import. Paste or upload a CSV with at least an email column. Start with 50-100 contacts to test your messaging.
Minute 7-10: Create Your Campaign Go to Campaigns > Create Campaign > Email Campaign. • Name your campaign • Select your prospect list • Write Step 1: Subject line + body with merge tags ({{firstName}}, {{company}}) • Add 1-2 follow-up steps with 3-day delays • Assign your mailbox
Minute 11-13: Configure Settings • Daily limit: 20-30 emails/day (conservative start) • Sending window: 9 AM - 5 PM in your prospects' timezone • Active days: Monday through Friday • Enable: Stop on Reply, Stop on Bounce
Minute 14-15: Launch Preview your email with sample data. Click Activate. Your campaign starts sending within the next sending window.
Important: This quick start skips warmup for speed. For best results, warm up your mailbox for 2-3 weeks first (see 'How Email Warmup Works'). Without warmup, start with very low daily volume (10-15 emails/day) and monitor your Health Score closely.
Display Name — Your name shown to team members and in sender merge tags ({{sender_name}}).
Email — Your login email address. Used for billing receipts and support communication. You can change your email by clicking 'Change Email' — a verification code will be sent to your new address to confirm the change.
Timezone — Your default timezone for sending windows and analytics. Individual campaigns can override this.
Signing in:
No password — WarmySender doesn't use passwords, so there's nothing to set, change, or reset. You sign in by entering your email address and then the 6-digit code we email you.
Session Duration — Sessions last 30 days. After that you sign in again with a fresh code.
Can't get in? See 'Can't sign in, or your session expired' in Troubleshooting.
Workspace Settings:
Workspace Name — The name displayed in the sidebar and workspace switcher.
Default Sending Window — Set default hours for new campaigns (can be overridden per campaign).
You can adjust a mailbox's daily sending limit at any time without disconnecting or reconnecting the mailbox. The change is live and takes effect on the very next scheduler tick — no campaigns are disrupted, no authentication is re-requested, and no in-flight sends are lost.
Where to Find It 1) Go to the Mailboxes page. 2) Find the mailbox row you want to adjust. 3) Click the row's dropdown menu (the '...' or gear icon) and select 'Edit Daily Limit'. 4) The same option is available from the mailbox's View Details page if you prefer a fuller view before editing. 5) Enter the new daily limit and save. The value is stored on the mailbox's `dailyLimit` field and is picked up immediately by the next scheduler cycle.
Recommended Ranges • Brand-new mailbox (first 2 weeks): 20-30 emails/day. Stay conservative while warmup builds reputation. • Warmed-up mailbox (health score 70+, 2+ weeks of warmup): 50-100+ emails/day is safe. Increase gradually, not all at once. • Never exceed 500/day per mailbox — that is WarmySender's global per-mailbox hard cap and the practical ceiling for any single inbox.
How It Interacts With Campaign-Level Caps WarmySender enforces THREE sending caps and the MINIMUM of the three always wins. Sends stop the moment the first cap is hit: • Mailbox `dailyLimit` — the value you set on this page. • Campaign `dailySendLimit` — a cap per campaign across all of its mailboxes. • Campaign-mailbox `maxSendsPerMailboxPerDay` — a cap on how much a single mailbox can send for a single campaign.
Example: mailbox limit 100, campaign limit 50, per-mailbox-per-campaign limit 30 → only 30 sends will happen through that mailbox for that campaign today.
Warmup Traffic Is Counted Separately Warmup sends use the `warmupTargetDailyVolume` field, not `dailyLimit`. Raising or lowering your campaign daily limit does not affect how many warmup emails your mailbox sends. To adjust warmup volume, go to the Warmup settings for the mailbox instead.
Changes Apply to the Current Day The daily limit is enforced against today's running send count. If the mailbox has already sent 25 emails today and you raise the limit from 25 to 30, it can still send 5 more today. If you lower the limit below the current count, sending simply pauses until tomorrow — no error, no disruption.
TL;DR: If you just want to change a setting (like the daily sending limit), DO NOT disconnect and reconnect. Use the Edit Daily Limit option on the Mailboxes page — it is live and non-disruptive. Only delete-and-reconnect when the mailbox is genuinely broken (expired credentials, provider migration, persistent auth errors). Deleting creates a NEW mailbox record with a new internal ID, which requires a small manual follow-up step to keep campaigns flowing.
What Survives a Delete Prospects are NEVER deleted when you remove a mailbox. Specifically: • Prospect rows remain in the database with their full sequence history. • The sequence step cursor (which email they are on) is preserved — leads will NOT restart at Email 1. • Reply-thread message IDs (`lastSentMessageId`) are preserved, so threaded replies continue to stitch correctly. • Campaign enrollments, suppression entries, opens, clicks, and replies all remain intact.
What Happens Technically When you delete a mailbox, the system runs a safe cleanup: every in-flight prospect that was assigned to that mailbox has its `mailbox_id` nulled (set to NULL, not deleted). The prospect stays in the campaign, waiting for the scheduler to pick a new mailbox from the campaign's pool on the next tick. The next scheduled send is pushed out by an hour so nothing fires immediately.
REQUIRED Action After You Reconnect This is the step people forget: after reconnecting, manually add the newly-connected mailbox to each affected campaign's mailbox pool. • Go to Campaign → Settings → Mailboxes. • Toggle the new mailbox on (or add it if it is not listed). • Save.
Without this step, the affected prospects have no mailbox to send from. The scheduler will keep rescheduling them +1 hour indefinitely, and your campaign will appear 'running' but produce zero sends until a valid mailbox is available.
Thread Continuity Is Safe Replies to Email 1 and Email 2 continue to thread correctly even after a reconnect. Thread IDs are stored on the prospect row (`lastSentMessageId`), not on the mailbox, so a new mailbox ID does not break References/In-Reply-To stitching.
Daily Limit Changes — Do Not Disconnect If your only goal is to change the daily sending limit, use the 'Edit Daily Limit' option on the Mailboxes page instead. It is live, requires no reconnect, and preserves the mailbox's internal ID — meaning every campaign keeps sending without any manual pool update. See the 'Editing a Mailbox's Daily Sending Limit' guide above.
Warmup-Enabled Mailboxes Warmup stats (health score, inbox rate, spam rate, 7-day rolling history) are tied to the mailbox record. When you delete and reconnect, those stats reset because it is technically a new record. Plan for a short re-warmup period (a few days to a week) before running heavy campaign volume on the reconnected mailbox — this is another reason to avoid unnecessary reconnects.
Your trial is 7 days on the Pro plan, no credit card is required, and it switches on within a second or two of you signing up. Starting a trial sends no email, touches no LinkedIn or Instagram account, and cannot affect anyone's sender reputation — the worst case is a short wait.
If your dashboard still looks locked a minute later, three steps in order:
Refresh the page. The dashboard reads your plan fresh on every load, so give it about 30 seconds and refresh once more.
Open Billing. It is the one screen that says plainly whether anything is genuinely outstanding, with a button to settle it. If nothing is outstanding and your plan is listed, you are activated — go back and refresh.
Email [email protected] from your signup address. Please do not sign up a second time; a duplicate account splits your history and makes the fix slower.
What the trial covers: the Pro plan's cold email and email warmup features — connecting mailboxes, warming them up, and building and running campaigns. Two things sit outside it: the email verifier is not part of the trial, and LinkedIn and Instagram are separate add-on seats rather than something the trial turns on.
What happens at the end: nothing is charged and there is nothing to cancel. If you have not chosen a plan by then, your account moves into a restricted state rather than a free plan — you can still sign in and every mailbox, campaign, prospect, template and statistic is preserved, but campaigns stop sending and email warmup pauses until you pick a plan. Choosing one switches both back on within a few minutes, with your warmup progress kept, so the ramp does not restart at day one.
Full explainer with a worked example: /documentation/trial-activation
How to bulk import multiple mailboxes into WarmySender at once — the CSV format, supported header names, RFC-4180 quoting rules, per-row error reporting, subscription tier mailbox limits, and how to fix the most common errors. Cold emailing setup, scaled the right way.
Full explainer: /documentation/bulk-mailbox-import
Gmail and Outlook need a special App Password (with 2-Step Verification turned on). Most other providers — hosting and IMAP providers like All-Inkl, IONOS, Strato, Hostinger, Zoho, Fastmail, and most cPanel / webmail hosts — do not. You connect them with your normal mailbox password: the same one you use to sign in to your webmail. This guide shows how to connect or reconnect one of these mailboxes, which password to use, and what to do if you see "authentication failed."
Full explainer: /documentation/connecting-mailboxes-without-app-passwords
Step-by-step guide to connect a Gmail or Google Workspace alias-domain mailbox to WarmySender for cold email, warmup, and multichannel outreach. Covers App Passwords, the correct server hostnames, and the most common setup typos.
Full explainer: /documentation/connect-gmail-workspace-alias
You turned on 2-Step Verification and created a Google App Password, but your mailbox shows "authentication failed" on the first few tries. Here's the reassuring part: a brand-new App Password almost always works, and the common reasons it reads as failed at first are easy to fix — none of them mean you did the setup wrong. The three usual causes: the spaces Google shows in the password were pasted in, Google is running a quick one-time security check on the new password, or the normal login password was used instead of the App Password.
Full explainer: /documentation/gmail-app-password-says-auth-failed
If WarmySender shows your Microsoft 365 mailbox as 'SMTP Disabled by Admin' — at signup, or even after you've connected with Microsoft via OAuth — it means your tenant administrator has disabled SMTP AUTH at the tenant level. This guide explains why this happens (including why the OAuth connection alone doesn't bypass it), how to verify it, and the exact steps your admin needs to take to enable it.
Full explainer: /documentation/smtp-tenant-disabled
WarmySender's email warmup system automatically builds your sender reputation by exchanging emails between real mailboxes in our network. Here is how it works:
Sending: Your mailbox sends warmup emails to other WarmySender users' mailboxes according to your daily volume settings. The system starts with low volume and gradually increases over time.
Receiving: Other WarmySender users' mailboxes send emails to yours. Your mailbox automatically opens, marks as important, and replies to these emails — signaling to email providers (Gmail, Outlook, Yahoo) that your messages are wanted.
Spam Rescue: If any warmup emails land in your spam/junk folder, WarmySender automatically detects them and moves them back to your inbox. This 'rescues' your reputation by training email providers that your messages belong in the inbox.
Peer Selection: The system intelligently pairs your mailbox with other healthy mailboxes. It prefers cross-provider pairing (e.g., Gmail sends to Outlook) for better deliverability signals. Unhealthy mailboxes with high spam or bounce rates are excluded from the peer pool.
Health Scoring: Your mailbox gets a Health Score (0-100) calculated from inbox placement rate, spam rate, and bounce rate over a 7-day rolling window. Score above 80 = Excellent, 60-79 = Good, 40-59 = Fair, below 40 = Critical.
The warmup process runs 24/7 within your configured time window. Most mailboxes reach a healthy score within 2-3 weeks.
Normal — Balanced ramp (0.12 growth rate). Good default for most mailboxes.
Aggressive — Fastest ramp (0.20 growth rate). Only for established domains with existing reputation.
Strategy Modes — The system uses intelligent strategies that auto-evolve based on your mailbox's age and performance:
New Domain — Starts at 1 email/day, max 40/day. For brand-new domains with zero history.
New Mailbox — Starts at 3/day, max 60/day. For new mailboxes on established domains.
Dormant — Starts at 3/day, max 40/day. Auto-applied when a mailbox is idle for 14+ days.
Maintenance — steady-state for a fully warmed-up mailbox. While your emails keep landing in the inbox, it keeps sending at the target you set instead of a fixed low number.
Recovery — applied automatically when inbox placement dips. It eases volume right down while your reputation settles, then lifts it back toward your target on its own once placement recovers.
New Domain Ramp Table (day-by-day) Here is what the typical New Domain ramp looks like at Normal speed, assuming healthy bounce and complaint metrics throughout:
Day 1: 1 email/day Day 2-3: 1-2 emails/day Day 4-5: 2-3 emails/day Day 6-7: 3-4 emails/day Day 8-9: 5-6 emails/day Day 10-11: 7-8 emails/day Day 12-13: 9-10 emails/day Day 14: ~11-12 emails/day Day 21: ~18 emails/day (auto-graduates to New Mailbox mode) Day 30: ~30 emails/day Day 45+: 40 emails/day (New Domain cap)
Maintenance mode (after graduation): keeps climbing toward the target you set, as long as your mail lands in the inbox.
Note: Maintenance still ramps gradually — as your mail keeps landing in the inbox, volume rises toward your target. To send more overall, raise your target or add more inboxes. The ramp is intentionally gradual to protect your sender reputation — pushing harder increases the risk of landing in spam.
Automatic Strategy Transitions (A.H.D.E. System):
New Domain auto-promotes to New Mailbox after 30 days
New Mailbox auto-transitions to Maintenance after 21 days of active sending
If bounce rate exceeds 10% or spam rate exceeds 5%, the system auto-switches to Recovery mode
After successful recovery, the system returns to your previous mode
If you manually set a strategy, auto-evolution is paused for 30 days — except a mailbox that was moved into Recovery automatically will still return toward your target on its own once placement recovers.
Daily Volume — Set your target warmup emails per day, up to a maximum of 120. The system ramps up to this target based on your ramp speed. Start low (5-10) for new mailboxes. The number you see on your warmup dashboard is the most this mailbox will send today.
Time Window — Set the hours and timezone during which warmup emails are sent (default: 24 hours, all day).
Health Score — Monitor your score (0-100): Excellent (80+, green), Good (60-79, blue), Fair (40-59, yellow), Critical (below 40, red). Keep it above 70 before starting campaigns.
Your warmup emails are protected by a multi-layered defense system that works around the clock to ensure reliable delivery and safeguard your sender reputation.
Layer 1: Global Domain Blocklist Our team maintains a curated blocklist of domains that are excluded from the warmup peer pool. If a domain is known to have persistent delivery issues — such as invalid mailboxes, expired accounts, or infrastructure problems — it is blocked system-wide so your warmup emails are never sent to unreliable destinations.
Layer 2: Automatic MX/SMTP Health Checking A background service runs every 2 hours to verify the DNS records and mail server reachability of every domain in the warmup pool. If a domain's mail server becomes unreachable or stops responding, it is automatically excluded from peer selection. When the domain comes back online and passes health checks again, it is restored automatically — no manual intervention needed.
Layer 3: IMAP Bounce Detection During regular inbox scanning, the system monitors for bounce-back messages and delivery failure notifications (also known as NDRs). If a particular domain causes 3 or more bounces within a 7-day window, it is automatically added to the blocklist. This catches delayed delivery failures that may pass initial send checks but ultimately fail.
Additional Safeguards:
Spam Rescue — Warmup emails that land in spam or junk folders are automatically detected and moved back to your inbox, training email providers that your messages are legitimate.
Cross-Provider Pairing — The system prefers pairing mailboxes across different providers (e.g., Gmail to Outlook) for stronger deliverability signals.
Health Scoring — Every mailbox receives a health score. Mailboxes with poor scores are excluded from the peer pool to protect other users.
Pool Depletion Protection — If most peers become temporarily unavailable, the system falls back gracefully rather than blocking your warmup entirely. Your warmup continues with available healthy peers.
All of these protections run automatically in the background. You do not need to configure or manage anything — just enable warmup and the system handles the rest.
Every mailbox in WarmySender receives a Health Score from 0 to 100 that reflects its current sender reputation based on warmup performance.
How the Score Is Calculated Your health score is computed from three key metrics measured over a rolling 7-day window: • Inbox Rate — The percentage of warmup emails that land in the recipient's inbox (not spam). Higher is better. • Spam Rate — The percentage of warmup emails that end up in spam or junk folders. Lower is better. • Bounce Rate — The percentage of warmup emails that fail to deliver. Lower is better.
The score penalizes bounces most heavily (they have the greatest negative impact), followed by spam placement, then low inbox rates.
Score Ranges • Excellent (80-100) — Your mailbox has a strong reputation. Safe to run campaigns at full volume. • Good (60-79) — Solid reputation with room for improvement. Campaigns can run, but monitor closely. • Fair (40-59) — Reputation needs attention. Consider reducing campaign volume and letting warmup strengthen your score. • Critical (below 40) — Significant reputation issues detected. The system may auto-switch your mailbox to Recovery mode to protect your domain.
What Affects Your Score • Emails landing in spam folders lower your score. • Bounced or undeliverable emails reduce your score. • Successful inbox placements and positive engagement (opens, replies) improve your score.
How the System Uses Scores • Mailboxes with low scores are automatically excluded from the warmup peer pool to protect other users. • If your score drops sharply, the system may trigger Recovery mode, which reduces volume and focuses on rebuilding reputation. • Once your score recovers, normal warmup volume resumes automatically.
Tips for a Healthy Score • Keep your score above 70 before starting any email campaigns. • Verify your DNS records (SPF, DKIM, DMARC) are correctly configured. • Monitor your bounce rate — a sudden spike often indicates a DNS or server issue. • Let warmup run consistently for 2-3 weeks before judging results. • If your score drops, check your mailbox connection and DNS settings before taking other action.
Spam Rescue is one of WarmySender's most powerful features for building your sender reputation. It works automatically to ensure warmup emails always end up in your inbox — even when email providers initially route them to spam.
How Spam Rescue Works During regular IMAP scans, WarmySender checks both your inbox and your spam/junk folders. When a warmup email is found in spam, the system identifies it using internal tracking tokens and automatically moves it back to your inbox.
Why This Matters Every time a message is moved from spam to inbox, it sends a strong signal to your email provider (Gmail, Outlook, Yahoo, and others) that emails from that sender are legitimate and wanted. Over time, these signals train the provider's spam filters to trust your domain, improving your overall inbox placement rate.
Automatic and Hands-Free Spam rescue happens entirely in the background — you do not need to manually check your spam folder or move any emails. The system handles detection and rescue automatically during each scan cycle.
Impact on Your Health Score Your inbox placement rate — including emails successfully rescued from spam — contributes directly to your mailbox health score. A high rescue success rate helps maintain a strong score, while emails that remain undetected in spam would lower it.
Works Across All Providers Spam rescue is compatible with all connected email providers, including: • Gmail and Google Workspace • Outlook and Microsoft 365 • Yahoo Mail • Any custom IMAP-compatible email service
The system adapts to each provider's folder structure and naming conventions (Spam, Junk, Bulk Mail, etc.) to ensure comprehensive coverage.
No Configuration Required Spam rescue is enabled by default for all mailboxes with warmup active. Simply connect your mailbox, enable warmup, and the system takes care of the rest.
Warmup and campaign emails share your daily sending capacity, so understanding how they interact is important for a successful outreach strategy.
Shared Daily Quota Your subscription plan sets a total daily sending limit per mailbox. Both warmup emails and campaign emails count toward this limit. For example, if your plan allows 50 emails per day and warmup sends 20, you have 30 remaining for campaigns.
When to Start Campaigns Before launching your first campaign, make sure: • Warmup has been running for at least 2-3 weeks. • Your mailbox Health Score is 70 or above. • Your DNS records (SPF, DKIM, DMARC) are properly configured. • Your bounce rate is below 3% over the last 7 days.
Keep Warmup Running Never fully disable warmup once you start campaigns. Instead, reduce warmup volume to make room for campaign sends. The system automatically adjusts — a warmed-up mailbox in Maintenance keeps warmup at the pace you've targeted — lower your warmup target any time to free daily capacity for campaigns while keeping your reputation active.
Balancing Volume If you need more daily capacity for campaigns, you can lower your warmup daily limit. A good balance is keeping warmup at 15-20 emails per day while dedicating the rest to campaigns. This ensures ongoing reputation maintenance without starving your outreach.
Automatic Safety If your campaign sends cause bounce or spam rates to spike, the warmup system detects this through the shared health metrics and may trigger Recovery mode. This is a protective measure — reduce campaign volume and let your reputation recover before resuming.
If your mailbox Health Score drops significantly, follow these steps to diagnose and recover.
Step 1: Check Your Mailbox Connection Go to your mailbox settings and verify the connection status is 'Connected'. A disconnected or expired OAuth token means warmup emails cannot be sent or received, which will cause your score to drop.
Step 2: Verify DNS Records Check that your SPF, DKIM, and DMARC records are correctly configured in your domain's DNS settings. Missing or misconfigured DNS is the most common cause of sudden score drops. Use the Analytics page to verify your DNS setup.
Step 3: Review Bounce Rate A spike in bounces (above 5%) strongly impacts your score. Common causes include: • DNS records changed or removed. • Mail server configuration issues. • Sending to outdated or invalid email addresses in campaigns.
Step 4: Pause Campaigns Temporarily If your score is below 50, consider pausing active campaigns until your score recovers above 60. Campaign sends with a damaged reputation will have poor deliverability and can make the problem worse.
Step 5: Let Recovery Mode Work If the system has auto-switched your mailbox to Recovery mode, do not override it. Recovery mode reduces daily volume and focuses on rebuilding your reputation through carefully managed warmup sends. Most mailboxes recover within 2-4 weeks.
Step 6: Monitor Daily Check your score daily during recovery. Look for a steady upward trend. Small daily fluctuations are normal — focus on the 7-day trend rather than individual days.
When to Contact Support If your score does not improve after 3 weeks of consistent warmup with good DNS, or if you see a sudden drop with no apparent cause, reach out for assistance.
If one of your inboxes shows 'temporary provider slowdown', it means your email provider was briefly slow to respond the last time WarmySender tried to send or check mail on that inbox. This is almost always a short-lived hiccup on the provider's side. WarmySender keeps retrying automatically — you don't need to do anything, and the inbox usually clears itself within a short while.
What WarmySender does automatically: When a provider is briefly slow, WarmySender backs off for a moment and tries again on its own until the provider responds normally. In the large majority of cases the inbox returns to a healthy state by itself, often within minutes, and your warmup and campaigns carry on as normal. The retries are paced gently on purpose — pushing too hard could make your provider treat your inbox as misbehaving, which would hurt your sender reputation.
Regenerating your password won't help: This is NOT a password problem. Your credentials are fine — the provider was just slow to answer this time. Generating a new app password or changing your password will not clear this status, and it can actually cause a real problem if the new password is entered incorrectly. The right move is simply to wait; WarmySender is already handling it.
When to reconnect: There's one exception. If an inbox stays unavailable for a long time — not minutes, but persistently over an extended period — that suggests something changed on the provider's side beyond a brief slowdown. In that case, open your Mailboxes page, find the affected inbox, and use the reconnect option. Your warmup history, settings, and campaign enrollments are preserved across a reconnect.
This status means the inbox is still connected (not disconnected) — the provider was just briefly slow. For the full explanation with an example, see the 'Why an inbox shows temporary provider slowdown' guide.
Seeing unfamiliar, friendly-looking emails in your inbox? Those are warmup emails, and they're a sign warmup is actively running on your mailbox. Nothing is wrong.
Why they're there Email warmup works by having real inboxes send each other natural-looking messages and mark them as wanted. That steady, positive activity is what builds your sender reputation over time — and it only works because it runs through your real mailbox, not a hidden test account. So some warmup messages briefly land where you can see them.
You don't need to do anything Warmup emails are tidied out of your inbox automatically, typically within about a day, so they never pile up. You don't need to delete, archive, or sort them. Your real emails and your campaign replies are never moved, archived, or deleted — only warmup mail is tidied.
Why you sometimes see a cluster The number of warmup emails you briefly see tracks your own sending volume. When you send more, more warmup replies arrive at once, so you may notice a short-lived cluster before they're cleared away. When your volume is low, you'll rarely see any. Quiet, then a brief cluster, then gone is expected — not a glitch.
How to filter them yourself (about 30 seconds) If you'd rather not see them at all, every warmup email's subject line ends with a short tag like [ref: AB12CD34]. The letters and numbers change, but '[ref:' is always there, so one rule catches every warmup message. • Gmail: Settings > See all settings > Filters and Blocked Addresses > Create a new filter. Put [ref: in the Subject field, click Create filter, then choose 'Skip the Inbox (Archive it)' and/or apply a label such as 'Warmup'. Tick 'Also apply filter to matching conversations' to catch the ones already there. • Outlook: Settings > Mail > Rules > Add new rule. Set the condition to 'Subject includes' and enter [ref:, then set the action to 'Move to' and pick a folder. Filtering, moving or deleting warmup emails doesn't affect warmup, your warmup results, or your sending reputation.
See them in your Sent folder too? That's a different cause with a different fix — see 'Why Warmup Emails Appear in Your Sent Folder'.
Full explainer with a 7-question FAQ: /documentation/why-warmup-emails-appear-in-your-inbox.
If your Sent folder is full of warmup messages, here's the short answer: your email provider put them there, not WarmySender.
Why they're there Warmup is sent from your real mailbox, and most providers automatically keep a copy of everything sent from your account — every message, whoever or whatever sent it. Outlook and Microsoft 365 (where the folder is 'Sent Items'), Gmail and Google Workspace, Yahoo, AOL and iCloud all do this. WarmySender never saves a warmup message to your Sent folder: warmup is automated background activity, not mail you wrote, so filing a copy under 'sent by you' would be misleading. Seeing them there actually confirms warmup is running.
Mailboxes on a custom domain with a smaller host often don't save outgoing mail automatically, so warmup never shows up in Sent at all — which is why two people on identical plans can genuinely see different things here. It comes down to who hosts the mailbox.
Your real mail is treated differently, on purpose: campaign emails, sequence steps and replies you send from WarmySender are saved to Sent on providers that don't do it themselves, and skipped on Outlook and Gmail because those providers already save it (skipping avoids duplicates).
Hide them with one filter (about 30 seconds) You can't stop your provider from saving its own copy — that setting belongs to them. What you can do is move those copies out of the way automatically. Every warmup subject line ends with a short tag like [ref: AB12CD34]; the letters and numbers change but '[ref:' is always there, so one rule catches every warmup message. • Gmail: Settings > See all settings > Filters and Blocked Addresses > Create a new filter. Put [ref: in the Subject field, click Create filter, and apply a label such as 'Warmup'. Tick 'Also apply filter to matching conversations' to catch the backlog. Gmail shows Sent as a label, so browsing 'in:sent -label:Warmup' then shows only the mail you wrote. • Outlook: Settings > Mail > Rules > Add new rule. Condition 'Subject includes' [ref:, action 'Move to' a folder you create (e.g. 'Warmup'). Outlook rules only apply to NEW mail, so sort Sent Items by subject and move the existing block across once.
Does this hurt deliverability? No. A copy in your Sent folder is just a record on your own mailbox — it has no bearing on inbox placement, and filtering, moving or deleting those copies doesn't affect warmup or your warmup results. One thing worth watching: Sent copies do use mailbox storage, and MOVING them frees nothing — they must be deleted to reclaim space, which matters if your mailbox is close to full.
What about the ones in your inbox? Those are tidied away automatically within about a day — see 'Why Warmup Emails Appear in Your Inbox'.
Full explainer with click-by-click recipes and an 8-question FAQ: /documentation/why-warmup-emails-appear-in-your-sent-folder.
If you've found your sending domain (or the address you send from) on a blocklist — sometimes called a spam list, blacklist, or abuse list — the short version is: don't panic. A blocklist is a public, community-run list of domains and addresses that some email systems consult to help decide what might be unwanted mail. A listing can affect whether some of your messages reach the inbox, but appearing on one does NOT automatically mean you did anything wrong — and most listings can be cleared.
What a blocklist actually is: Think of it as a community watch list for email. Independent organizations keep public lists of domains and addresses they consider risky, and many email systems check those lists as one of many signals when deciding where to place a message. There are many such lists, run by many different groups, each with its own rules for adding and removing entries. Being on one list is rarely the whole story — it's one signal among many, not a permanent verdict.
Why a brand-new domain can get listed (without any wrongdoing): A sending domain that's only days or weeks old can show up on a blocklist even when you've sent nothing but legitimate, wanted email. Common, completely innocent reasons: (1) it's new and unproven — a domain with no sending history hasn't earned trust yet, so some lists treat brand-new senders cautiously; (2) it shares space with others — if you send through a shared service or address range, the past behavior of unrelated senders nearby can spill over; (3) volume ramped up quickly — going from zero to a lot of email fast looks unusual to automated systems; (4) a previous owner — if the domain name was used by someone else before you, an older listing can linger. In short, a listing is often about being new and unestablished rather than breaking any rules.
How to check whether you're listed: You can look this up yourself in a couple of minutes with a free public tool. (1) Use a free public lookup such as MXToolbox (other reputable checkers work too) — type in your sending domain and the mail host you send through and it checks many community lists at once. (2) Read the result — it tells you which lists, if any, currently include you; if you come back clean, there's nothing to remove. (3) Check both the domain and the sending host, since a listing can be tied to either; that tells you where the entry actually lives.
How to request removal (delisting): Each list is run by a different organization and handles removals its own way, but the pattern is almost always the same: (1) go to the specific list that flagged you — the lookup result usually links straight to it; (2) find its removal or delisting page (often labeled 'delist,' 'removal,' or 'request review'); (3) address whatever reason it cites first, then submit the form honestly — some lists clear automatically after a quiet period, others review by hand; (4) don't fix the symptom and skip the cause — if the underlying pattern is still happening you can simply be re-listed. WarmySender can't remove an outside list's entry on your behalf, but the removal forms are self-serve and the lookup tools link you right to them.
The lasting fix — gentle volume and warmup over time: The most reliable way to clear a listing and stay off these lists is to build a genuine, trusted sending reputation, which is exactly what warmup does. Keep your volume gentle, especially at the start (sudden spikes are a top trigger). Let warmup run — it steadily exchanges wanted email so your domain builds a track record of healthy sending, and over a few weeks this convinces both inbox providers and community lists that you're trustworthy. Be patient and consistent — a steady, modest rhythm beats a burst followed by silence, and the trend over a couple of weeks is what matters, not any single day.
Why passing SPF, DKIM, and DMARC helps: These are settings on your domain that prove your email genuinely comes from you and hasn't been tampered with. Having all three set up and passing is a strong, positive signal that your domain is a real, properly configured sender. If they're passing, that works in your favor for both delisting and inbox placement. If they're not set up yet, configuring them is one of the most worthwhile first steps any sender can take.
What WarmySender does on your side: Warmup ramps your volume up gently rather than all at once (so you're less likely to trigger a cautious listing in the first place) and eases off automatically if it sees signs of trouble. It can't remove an entry from an outside community list for you — that's the list owner's process — but it steadily builds the healthy sending history that keeps you off these lists and gets you back in the inbox. For the full explanation with FAQs, see the 'My sending domain shows on a blocklist' guide at /documentation/my-sending-domain-shows-on-a-blocklist.
Best practices for warming up multiple domains simultaneously.
Why Use Multiple Domains? • Protect your primary domain — Use secondary domains for cold outreach so your main business domain stays clean. • Scale volume safely — Each domain can send a limited amount per day. More domains = more total capacity. • Risk isolation — If one domain gets flagged, your other domains continue working.
Domain Setup Strategy:
Buy 2-5 secondary domains similar to your primary (e.g., if you own acme.com, buy acmehq.com, getacme.com, tryacme.com).
Set up SPF, DKIM, and DMARC on each domain before connecting.
Create 1-3 mailboxes per domain (don't create too many on a single domain).
Point each domain to your website or create a simple landing page — email providers check if the domain has real web presence.
Warmup Approach:
Start all domains in warmup simultaneously — there is no need to stagger.
Use Conservative ramp speed for all new domains.
Each mailbox warms up independently — they each build their own reputation.
Wait until ALL domains reach Health Score 70+ before starting campaigns.
Campaign Distribution:
Assign mailboxes from different domains to the same campaign using mailbox rotation.
Round-robin rotation distributes sends evenly across domains.
If one domain's health drops, disable its mailboxes from the campaign without stopping others.
Monitoring:
Check each domain's SPF/DKIM/DMARC status in Analytics > Mailboxes.
Monitor per-mailbox Health Scores — one unhealthy domain should not affect others.
If a domain enters Recovery mode, reduce or pause campaigns for that domain while it recovers.
Common Mistakes:
Using domains that look spammy (random characters, suspicious TLDs) — buy professional-looking domains.
Not setting up DNS records on secondary domains.
Putting too many mailboxes (5+) on a single new domain.
Starting campaigns before warmup reaches healthy scores on all domains.
Q: How long should I warm up before sending campaigns? A: At minimum 2-3 weeks for existing domains, 4-6 weeks for brand-new domains. Wait until your Health Score is consistently above 70.
Q: Can I run warmup and campaigns at the same time? A: Yes, and you should. Both share your daily sending quota. The system auto-adjusts — in Maintenance mode, a healthy mailbox sends up to the daily warmup target you set, leaving the rest of your capacity for campaigns.
Q: Why did my warmup strategy change automatically? A: WarmySender's A.H.D.E. system auto-evolves strategies based on your mailbox age and performance. For example, New Domain promotes to New Mailbox after 30 days, and high bounce rates trigger Recovery mode.
Q: What if my Health Score is stuck and won't improve? A: Check: (1) DNS records are correct (SPF, DKIM, DMARC). (2) Mailbox is connected and active. (3) No campaigns causing high bounce rates. (4) Give it 2-3 weeks of consistent warmup.
Q: Should I warm up on weekends? A: Yes. Warmup runs 24/7 by default and sending on weekends helps build natural engagement patterns. Campaign sends are separate — those follow your configured schedule.
Q: How many warmup emails per day is optimal? A: Start with 5-10 for new domains. The system ramps up automatically based on your ramp speed. At full maturity, a healthy mailbox sends up to the daily target you set.
Q: Do the replies my mailbox sends during warmup count toward my daily warmup target? A: No. Your daily warmup target counts only the fresh warmup emails your mailbox starts. When your mailbox replies to a warmup message it received, that reply is part of the natural back-and-forth of a warmup conversation and does not use up your target. The number you see on your warmup dashboard is the most fresh warmup emails this mailbox will send today.
Q: Will warmup emails be visible to my contacts? A: Warmup emails are sent to other WarmySender users' mailboxes, not to your contacts. The system automatically manages them — they are not visible in your regular inbox flow.
Q: Can I warm up a mailbox I have been using for years? A: Yes. The system detects established mailboxes and assigns an appropriate strategy. Existing reputation is preserved — warmup reinforces and maintains it.
Q: What happens if I disable warmup? A: Your sender reputation gradually decays without active warmup. If you are running campaigns, keep warmup on in Maintenance mode to sustain your deliverability.
The Dashboard Health Score is a composite workspace-wide score (0-100) that reflects the overall health of your outreach across all systems — email campaigns, warmup, LinkedIn, and campaigns. It is different from the per-mailbox Warmup Health Score.
How the Dashboard Score Is Calculated The score combines four sub-scores with dynamic weighting:
1) Email Sub-Score (40-50% weight) — Based on your campaign performance over the last 30 days: • Bounce rate: below 2% = excellent, below 5% = good, above 5% = poor • Open rate: above 30% = excellent, above 20% = good, below 20% = poor • Reply rate: above 5% = excellent, above 2% = good, below 2% = poor This sub-score is the average of all three metrics.
2) Warmup Sub-Score (30-40% weight) — Based on warmup performance:
DNS health: percentage of mailboxes with valid SPF and DKIM records
3) LinkedIn Sub-Score (20% weight, only if LinkedIn accounts exist) — Based on:
Average account health score across connected LinkedIn accounts
Restrictions: any active restrictions heavily reduce this score
4) Campaign Sub-Score (10% weight) — Based on:
Whether you have active running campaigns (yes = good)
High bounce rate penalty (above 5% with 50+ sends = -30 points)
Dynamic Weighting Only systems you are actively using contribute to the score. If you have no LinkedIn accounts, the LinkedIn sub-score is excluded and the remaining weights are redistributed proportionally. If you have no campaigns, the campaign sub-score is excluded. This prevents unused features from penalizing your score.
Why Your Dashboard Score Differs from Warmup Scores Your per-mailbox warmup health scores (shown on the Warmup page) measure only warmup email deliverability — inbox rate, spam rate, and bounce rate from warmup emails. The Dashboard Health Score includes campaign performance, LinkedIn health, and DNS status. You can have perfect warmup scores (100) while the Dashboard Score is lower because campaign open rates are low or LinkedIn has issues.
Common Reasons the Dashboard Score Drops • Low campaign open rates (below 20%) — This is the most common cause. If you just started campaigns on new domains, open rates may be low initially. • Zero reply rate — No campaign replies yet heavily penalizes the email sub-score. • LinkedIn account needs re-verification — A disconnected or restricted LinkedIn account drops the LinkedIn sub-score significantly. • Missing DNS records — SPF or DKIM not configured on some mailboxes lowers the warmup sub-score. • High bounce rate — Campaign bounces above 5% penalize both the email and campaign sub-scores.
How to Improve Your Dashboard Score • Warm up mailboxes for 2-3 weeks before starting campaigns — this builds reputation for better open rates. • Verify email lists before campaigns — reduces bounces. • Write better subject lines — improves open rates (aim for 30%+). • Keep LinkedIn accounts connected and verified. • Configure SPF, DKIM, and DMARC on all sending domains. • Start campaigns with small volumes (20-30/day) and increase gradually. • Monitor the Analytics page to track which sub-area needs improvement.
Once your domain is fully warmed, a good rule of thumb is to send up to roughly 30-50 cold emails per day per mailbox, and to grow total volume by adding more mailboxes rather than pushing any single one harder. Keep warmup running afterwards as ongoing maintenance, and never drop an active mailbox to zero. These are best-practice ranges to protect deliverability — guidance, not guarantees.
How much per day (per mailbox, once fully warmed): scale by adding mailboxes (ideally across more than one sending domain), each sending a modest amount, and let WarmySender pace sends across your day and sending window (a sudden burst is one of the strongest signals to inbox providers that a sender is automated). If you need 500/day, that's far safer as ten mailboxes at ~50/day than one at 500/day.
By provider (conservative per-mailbox cold-send ceilings to ramp toward):
Free Gmail (@gmail.com) — keep it low, ~20-30/day; a paid Google Workspace address on your own domain is a better foundation.
Google Workspace (your domain) — up to ~30-50/day once warmed, with SPF/DKIM/DMARC passing.
Microsoft (Outlook / Microsoft 365) — a bit stricter, ~25-40/day; authentication matters a lot.
Yahoo / AOL — keep modest, ~20-30/day.
Keep warmup on afterwards: reputation is a running average providers keep re-evaluating, so a steady trickle of genuine, wanted email keeps your baseline healthy and cushions the odd complaint. Recommended ongoing ratio: roughly 1 warmup email for every 2-4 cold emails per mailbox (about a quarter to a half of your daily cold volume). You don't need warmup to match cold volume once established — just don't turn it off.
How long warmup takes: most mailboxes reach a healthy, established state in about 2-3 weeks, and a brand-new domain is best treated as fully aged closer to 4-6 weeks. WarmySender starts a new domain very low (around a single email a day) and ramps up gradually while bounce and complaint signals stay healthy, reaching a steady target after about a month. The ramp can't be skipped — pushing harder to finish faster is what harms a young domain.
Minimum daily floor: don't let an active mailbox sit at zero. Keep at least a small floor, on the order of 5-15 emails a day (cold, warmup, or both combined), because reputation fades with silence and a sudden return to volume after a quiet spell can look like a brand-new sender. Keeping warmup running covers this floor on its own, especially when you pause cold campaigns between lists.
For the full guide with a best-practice checklist and FAQs, see 'Safe cold email sending limits after warmup' at /documentation/safe-cold-email-sending-limits-after-warmup.
How WarmySender's email warmup ramps up gradually across your first hour, first day, and first week. Why both sending AND receiving are capped on a new mailbox, what the day-1 / day-7 / day-14 volume targets are, and why mature warmup providers control receive-side rate just as carefully as send-side rate. Practical answers to 'why don't I see emails yet?' and 'can I skip the ramp?'
Full explainer: /documentation/how-warmup-ramps-up
What your warmup Inbox Rate means in WarmySender: of the warmup emails we could verify, the share that landed in the inbox instead of spam. Why some emails are 'unverified' and don't count for or against your rate, what 'Verified X% of sent' (coverage) means, a worked example, and why the headline number and the per-mailbox numbers now always agree.
Full explainer: /documentation/understanding-your-warmup-inbox-rate
Warmup and auto-stop-on-reply both need to READ your inbox, which requires incoming (IMAP) access — not just outgoing (SMTP). Warmup works by your inbox receiving friendly warmup mail, measuring whether it landed in the inbox or spam, and rescuing anything caught in spam — all of which means reading the inbox. Campaign follow-ups that stop the moment someone replies work by watching your inbox for that reply, and a reply always comes back to the address the campaign sent from — so the sending mailbox is the one that needs incoming access. An outgoing-only (SMTP) connection can send, but it can't do those receive-and-measure steps. Add incoming (IMAP) for the full experience; a Gmail or Outlook sign-in sets both up automatically.
Full explainer: /documentation/why-warmup-needs-imap-incoming-access
Why one of your mailboxes can show warmup as active while incoming warmup emails briefly slow or stop arriving, what the 'Incoming warmup catching up' note means, and why no action is needed. Your sending keeps working normally, WarmySender detects and restores incoming warmup automatically, and it usually resolves on its own within a few days.
Full explainer: /documentation/warmup-shows-active-but-no-emails-arriving
Why warmup can briefly pause on one of your mailboxes — usually a precaution to protect your sending reputation after a temporary delivery issue — and why you almost certainly don't need to worry. Your mailbox stays connected, your warmup progress is kept, and your cold email and LinkedIn campaigns keep running. It often resumes on its own, and you can turn it back on in one click.
Full explainer: /documentation/why-your-warmup-can-pause
What the warmup score on your mailbox means, why a brand-new mailbox shows "Building data" instead of a number, why a score climbs back on its own after a rough patch, and how to tell when a mailbox is safe to send from. It reflects roughly the last week of how well your warmup mail has been landing in the inbox.
Full explainer: /documentation/what-is-my-mailbox-warmup-score
Where to find WarmySender's warmup volume controls and how to use them: set a target daily volume (10-100 emails per day, per mailbox), choose a Conservative, Normal, or Aggressive ramp, and adjust several mailboxes at once. Included on every plan and during your free trial — no separate upgrade. Why warmup always ramps within built-in safety limits that protect your deliverability.
Full explainer: /documentation/how-to-control-your-warmup-sending-volume
How WarmySender's email warmup keeps your sender reputation safe: it automatically avoids sending to inboxes that aren't accepting mail — on your first message and on every follow-up reply — steers around a full or unavailable inbox instead of sending into it again, and never lets those skipped sends count against your mailbox. Runs automatically, nothing to configure.
Full explainer: /documentation/how-warmup-protects-your-deliverability
Choose the language your warmup emails are written in — English, Spanish, French, German, Portuguese, Italian, or Dutch. Warmup mail is composed natively in your chosen language, not machine-translated, so it reads like a real person. Set it under Warmup > Settings > Email Language and watch the live Example Warmup Emails preview update. The setting applies to newly generated warmup mail, and matching your warmup language to the language you actually send in makes your warmup activity more representative of how the mailbox is used.
Full explainer: /documentation/set-your-warmup-language
WarmySender sends your warmup emails spread naturally across the day — the way a real person sends email — instead of firing them all in one burst. A burst of mail at a single hour looks automated to inbox providers; a natural spread looks human, which protects your sender reputation and keeps deliverability strong. You still get the same daily amount, just paced across the day, and you can see the next scheduled send time for each mailbox on your dashboard.
Full explainer: /documentation/why-warmup-emails-are-spread-through-the-day
If you check your warmup early in the day and see only a few emails sent so far, that's normal — nothing is broken. WarmySender spreads each day's warmup emails across the whole day (morning to evening) on purpose, so an early count is partial and keeps filling in. The daily amount also ramps up gradually over your first few weeks to protect deliverability, so early days are intentionally small. Worked example: seeing 2 of 5 at 5 AM is expected — the rest send later today.
Full explainer: /documentation/why-warmup-shows-few-emails-early-in-the-day
Prerequisites — Make sure your mailbox is connected, warmup has been running for 2-3 weeks, and your Health Score is above 70. Set up SPF, DKIM, and DMARC DNS records for your sending domain.
Create Campaign — Go to Campaigns, click 'Create Campaign', and select 'Email Campaign' (you can also choose LinkedIn or Multichannel if you have LinkedIn seats).
Add Prospects — Import contacts via CSV file, paste data directly, add individually, or select from an existing prospect list. You can also use prospects saved from the Leads Database.
4) Write Your Sequence — Create your email steps:
Step 1: Your initial outreach email with a compelling subject line
Use merge tags like {{firstName}}, {{company}}, {{role}} for personalization
Each step can be a new email or a reply to the same thread (threadable)
Configure Sending — Set your daily sending limit (start with 20-30/day), sending window (time of day + timezone), and active days (default: Mon-Fri). Assign one or more mailboxes to the campaign.
Review & Launch — Preview your emails with sample data, verify settings, and activate the campaign.
Monitor — Watch your campaign analytics: open rates, reply rates, bounce rates. Check Unified Inbox for replies. The system auto-pauses if safety metrics are violated (high bounce rate, spam complaints).
Best practice: Start with a small batch (50-100 prospects) to test your messaging before scaling up. Aim for: Open rate 40%+, Reply rate 5%+, Bounce rate below 3%.
A sequence is the ordered set of steps — emails and/or LinkedIn actions — that runs automatically for every lead you enroll. Two controls shape how it plays out: each step's delay decides WHEN it runs, and a Condition step decides WHICH WAY the path branches based on what the lead does (accepted, replied, opened). You build it once in the campaign builder's Sequence step.
How step delays work (the Day N timeline):
Every step has a Delay (days) and Hours field — it controls how long the step waits after the PREVIOUS step before it runs.
Day 0 means the first step is sent as soon as a lead is enrolled.
Each later step waits its own delay on top of where the lead already is, and the builder shows a running '~Day N after enrollment' estimate under each step so you can see the whole timeline.
Use Hours when you want a finer gap than a whole day (for example a 4-hour wait between two same-day touches).
Worked timeline example — a 3-step email sequence: • Step 1 — Delay 0 → sent on Day 0 (the moment the lead is enrolled). • Step 2 — Delay 3 → runs 3 days after step 1, on Day 3. • Step 3 — Delay 5 → runs 5 days after step 2, on Day 8. Each lead's clock starts from their own enrollment moment, so people who join later are automatically on the same relative cadence. Sends still respect your campaign's sending window, active days, and daily limits — if a step lands on a paused day or outside your hours, it goes out at the next allowed time.
How conditions (YES/NO branching) work:
A Condition step branches the path on what the lead does. Pick a Condition Type (for example LinkedIn Invite Accepted, LinkedIn Reply Received, or Email Opened) and a wait window, then choose where each side goes. Both the If YES and If NO branch can either Go to a later Step or End the sequence (stop the lead on that branch) — so you never need a blank, do-nothing step just to finish a lead off.
Set a branch to End the sequence to stop a lead the moment that path is taken — for example, branch on Email Opened or LinkedIn Reply Received and set YES to End the sequence so anyone who opens/replies drops out cleanly. (Leaving NO blank still stops the lead too, for backward compatibility.)
You usually don't need a reply condition just to stop someone who answers: Stop-on-Reply is on by default, so a reply automatically cancels that lead's remaining follow-ups.
On a LinkedIn-only campaign you'll see the LinkedIn condition types; on an email-only campaign the email ones; on a multichannel campaign you get all of them.
Worked LinkedIn example — invite, wait for the accept, then message only the people who accepted: 1) Step 1 — Connection Request (Send Connection Invite), Delay 0 → the invite goes out on Day 0. 2) Step 2 — Wait for Accept (a Condition, type LinkedIn Invite Accepted, wait window 7 days). If YES → go to the Follow-up Message. For NO, choose End the sequence (or leave NO blank) so the lead stops if they never accept. 3) Step 3 — Follow-up Message (Send Message), Delay 1 day → a day after the accept, your message lands. Someone who accepts on day 2 gets your message on day 3; someone who never accepts within 7 days quietly drops out with no message sent.
Combining several conditions in one step (AND / OR):
A Condition step can hold more than one condition. Click '+ Add condition' and a joiner appears between the rows — set it to AND (every condition must be true) or OR (any one condition is enough). One step uses a single joiner for the whole list, so the rows are all AND or all OR, never a mix.
Email Opened and Link Clicked take a counting operator plus a number: at least, more than, exactly, at most, or fewer than. So you can branch on 'opened at least 3 times' — a genuinely warm lead — instead of merely 'opened at all'. Link Clicked sits at 'at least 1 time' by default, which simply means they clicked.
The other conditions are one-time signals that either happened or didn't, with no number: Email Replied, Email Bounced, Wait Timeout, LinkedIn Invite Accepted, LinkedIn Reply Received, and Has LinkedIn Profile. There is no 'didn't happen' condition — every condition asks whether something happened, and the If NO branch is the path for everyone it didn't happen to.
Worked example — 'opened at least 2 times OR clicked': add a Condition step, set row one to Email Opened / at least / 2, add a second condition, set the joiner to OR, and set row two to Link Clicked at least 1 time. Point If YES at your warm follow-up and If NO at a different angle or End the sequence.
LinkedIn conditions stay on their own step. When a LinkedIn signal decides a branch, WarmySender also updates how it treats that person on LinkedIn from then on (for example marking them connected so no further invite attempts are made), and that follow-on action is only safe and unambiguous when a single LinkedIn signal made the decision. Account safety always wins, so chain instead: put the LinkedIn condition in its own Condition step and send its If YES branch into a second Condition step holding your email conditions.
There are no brackets and no nesting. To build something like '(opened at least 2 times OR clicked) AND hasn't replied', use two Condition steps in a row — the first with the open/click conditions joined by OR, its If YES feeding a second Condition step on Email Replied where If NO goes to your follow-up.
Timing nuance: a condition that is already true for everyone at the start — 'fewer than 2 opens' is true for a lead with zero opens — waits out the step's full wait window before deciding, so nobody is pushed down the no-engagement path before they've had a chance to engage. A condition that can only become true, like 'opened at least 2 times', decides the moment it's satisfied and the lead moves on straight away. So give any step that branches on low or absent engagement a realistic wait window.
Your existing campaigns are unaffected — this is purely additive, and a step only uses the new behaviour once you add a second condition or pick a counting operator. Full guide: https://warmysender.com/documentation/how-do-i-combine-multiple-conditions-in-a-sequence
The shortcut — start from a proven preset:
Click 'Use Preset' on the Sequence step and pick a template, and the whole flow is assembled for you. The LinkedIn 3-Step preset drops in the Connection Request → Wait for Accept (7-day window, YES wired to the message, NO left blank) → Follow-up Message flow above. Then you just edit the wording.
There are presets for the common shapes — a 3-Step Email Drip, a 5-Step Nurture, the LinkedIn 3-Step, and several multichannel flows. Everything in a preset stays fully editable.
A note on LinkedIn pacing and safety:
When your sequence includes LinkedIn steps, keep a 1-2 day gap between actions rather than stacking several on the same day. WarmySender automatically keeps each connected LinkedIn account within its safe daily limits and eases a newly connected account up gradually — account safety always comes before speed.
Your delays are a request, not a guarantee of instant sending: if a step would push an account past its safe daily limit, that step waits for the next available slot. You'll never get a burst of catch-up actions after a quiet stretch.
When a Send Message step follows a Send Connection Invite, always put a Wait for Accept condition between them — otherwise the message is skipped for anyone who hasn't accepted yet.
Tip: a single sequence can mix cold-email and LinkedIn steps — that's a multichannel sequence — and you can branch across channels (for example, send a LinkedIn invite only to people who didn't open your email).
A Condition step used to test exactly one signal. It can now hold several conditions at once, joined by a single AND (every condition must be true) or a single OR (any one is enough).
How to build it:
Add a Condition step to your sequence.
Set the first row — for example Email Opened, operator 'at least', number 2.
Click '+ Add condition'. A joiner appears between the rows; set it to AND or OR.
Set the second row — for example Link Clicked at 'at least 1 time', which simply means they clicked.
Set your wait window, then point If YES and If NO at the steps you want (either branch can also End the sequence).
Conditions that take a number: Email Opened and Link Clicked. Both accept an operator — at least, more than, exactly, at most, fewer than — plus a number, so you can branch on how engaged someone actually is rather than a plain yes/no.
Conditions that are just happened-or-not: Email Replied, Email Bounced, Wait Timeout, LinkedIn Invite Accepted, LinkedIn Reply Received, Has LinkedIn Profile. There is no 'didn't happen' condition — every condition asks whether something happened, and the If NO branch is the path for everyone it didn't happen to.
Worked examples:
'Opened at least 2 times OR clicked' — catches anyone who showed real interest, on either signal. Send If YES to a warm, direct follow-up.
'Opened at least 3 times AND clicked at least 1 time' — narrows to your hottest leads. Worth a low-friction ask.
Chaining across channels — put a LinkedIn Invite Accepted condition in its own step and feed its If YES into a second Condition step that checks your email conditions.
LinkedIn conditions stay single. When a LinkedIn signal decides a branch, WarmySender also updates how it treats that person on LinkedIn from then on (for example marking them connected so no further invite attempts are made). That follow-on action is only safe and unambiguous when a single LinkedIn signal made the decision — in 'invite accepted OR email opened' we couldn't tell which one fired, so we'd risk acting on LinkedIn based on something that never happened there. Account safety always wins, so chain the step instead.
No brackets, no nesting. One Condition step is a flat list with a single joiner, never a mix. To express '(opened at least 2 times OR clicked) AND hasn't replied', use two Condition steps in a row: the first with the open/click conditions joined by OR, its If YES feeding a second Condition step on Email Replied where If NO goes to your follow-up.
One timing behaviour worth knowing: a condition that is already true for everyone at the start — 'fewer than 2 opens' is true for a lead with zero opens — waits out the step's full wait window before deciding, so nobody is pushed down the no-engagement path before they've had a chance to engage. A condition that can only become true, like 'opened at least 2 times', decides the moment it's satisfied and the lead moves on immediately. Give any step branching on low or absent engagement a realistic wait window.
Your existing campaigns are unaffected. Every sequence built before this keeps behaving exactly as it did — nothing to migrate, re-save, or re-launch. A step only uses the new behaviour once you deliberately add a second condition or pick a counting operator.
Full guide with worked examples and FAQ: https://warmysender.com/documentation/how-do-i-combine-multiple-conditions-in-a-sequence
Email Campaign — Traditional cold email outreach. Steps include emails with subject lines, body content, and merge tags. Supports multi-step sequences with automated follow-ups, A/B testing, and tracking (opens, clicks, replies, bounces).
LinkedIn Campaign — LinkedIn-only outreach using your connected LinkedIn account. Step types include:
Wait Accept — Pause until the prospect accepts your connection
Send Message — Direct message to connected prospects (8,000 char limit)
Wait Reply — Pause until the prospect replies
View Profile — Visit the prospect's profile (creates a notification)
Engage Post — Like or comment on a prospect's post
Endorse Skill — Endorse a prospect's LinkedIn skill to build rapport before connecting
Send InMail — Premium feature for messaging non-connections
Conditional branches — Route prospects based on whether they accepted or replied
Multichannel Campaign — Combines email and LinkedIn steps in a single sequence. For example: Day 1 view LinkedIn profile, Day 2 send connection request, Day 4 send email, Day 7 send LinkedIn message. This creates multiple touchpoints across channels.
LinkedIn and Multichannel campaigns require an active paid subscription and LinkedIn seats ($15/month per seat). You can create campaigns from the Campaigns page using the 'Create Campaign' dropdown.
Multichannel campaigns let you combine email and LinkedIn outreach in a single sequence for maximum engagement.
Getting Started:
Go to Campaigns Hub and click 'New Campaign', then select 'Multichannel' as the campaign type.
You must have at least one email mailbox connected AND one LinkedIn account connected to create a multichannel campaign.
Building Your Sequence: Mix and match email steps and LinkedIn steps in any order: • Email steps — Send email, follow-up email, reply in thread • LinkedIn steps — View profile, send connection request, send message, send InMail
Example Multichannel Sequence:
Day 0: View LinkedIn profile (creates a notification so the prospect sees your name)
Day 1: Send connection request with a personalized note
Day 3: Send email if not yet connected (reaches them through a different channel)
Day 5: Send LinkedIn message if connected (follow up where the conversation started)
Day 8: Send follow-up email if no reply on either channel
Setting Delays: Configure delays in days and hours between each step. The system respects your sending windows and adds random jitter to keep outreach natural.
Cross-Channel Reply Detection: When a prospect replies on one channel, the entire sequence stops across all channels. An email reply stops pending LinkedIn steps, and a LinkedIn reply stops pending email steps. This prevents awkward double-outreach after someone has already responded.
Monitoring Results: Track multichannel campaign performance from the campaign detail view. You can see per-step metrics for both email (opens, clicks, replies) and LinkedIn (invites sent, accepted, messages delivered, replies) in one unified dashboard.
When you launch a campaign and the launch dialog says one or more prospects don't have data your template references — for example, your message uses {{custom.hook}} but five of sixty-nine prospects have no hook value — WarmySender blocks the launch and names up to five affected prospects per missing field. You have three ways to resolve it.
What the launch dialog shows:
For every missing variable like {{custom.hook}}, the dialog lists up to five affected prospect names plus the total affected count (e.g. "5 of 69 prospects don't have a hook value: Marie Dupont, James Carter, Priya Sharma, Tomás Rivera, Anna Schmidt").
If the affected count is larger than five, the dialog links to the full filtered list so you can see everyone.
A common shape: an outside AI tool generated a personalized opening line per prospect, worked for sixty-four prospects, but came back blank for five — your template includes {{custom.hook}} because most prospects have one, but the blank rows would render as broken messages.
Three ways to fix it:
Option 1 — Fill in the missing data on the named prospects, then re-import. Best when the affected prospects are valuable enough to fix. Note the names from the dialog, fill in the missing values in your source data (CSV, spreadsheet, CRM, AI tool, whatever generated the field), then import the CSV again with the missing values populated — there's nothing to tick. WarmySender matches by email address (or LinkedIn URL on a LinkedIn-only campaign) and fills the new values into the prospects you already have, without disturbing the rest of your data: your custom fields pick up the new values, and built-in details you already have (first name, last name, company, job title, city) are left exactly as they are, so a re-import can never overwrite a name you corrected by hand. Blank cells are ignored rather than wiping anything. Re-launch — the dialog will now pass with all prospects ready. You can also fill in the field manually for just the few affected prospects from the prospect detail page if the affected count is small.
Option 2 — Remove the affected prospects from the audience. Best when the affected prospects aren't worth fixing. Click 'Remove affected prospects' in the launch dialog and they're removed from the campaign's audience in one click — they stay in your prospect database, they just don't go into this campaign. Re-launch — the remaining prospects all have the data they need so the launch passes immediately.
Option 3 — Launch anyway. Best when you want the campaign running for prospects whose data is complete, while keeping the affected prospects parked until their data is filled in. This is the path most customers choose. Click 'Launch anyway' and the campaign launches immediately for every prospect whose data is complete; the affected prospects are parked — held aside in a waiting state, not sent, not deleted, not lost. Fix the missing data when you can (re-import or edit prospects one by one). The moment a prospect's data is complete, they automatically rejoin the normal sending flow and the campaign sends to them respecting your sending window, daily limits, and account ramp. No clicks needed once fixed.
How we keep your account safe:
Affected prospects do NOT send with missing data. No 'Hi Marie, , I noticed...' goes out. No blank placeholder, no literal token text.
Parked prospects don't consume daily limits, don't burn ramp budget, and don't count against account safety caps.
When parked prospects eventually resume, every send goes through normal account-safety gates: per-account daily limits, weekly limits, sending window, ramp ceiling, per-recipient cooldown.
Why we don't auto-skip them: A prospect with a missing custom field might still be a great lead — the missing field might be something fillable with a minute of effort. Auto-skipping silently would mean losing valuable prospects that are simple to recover. So we surface the choice to you up front rather than burying the decision. Parked prospects don't expire or time out; they wait as long as you need.
The same launch-time check runs on every channel WarmySender supports — Cold Emailing, LinkedIn Outreach, and Multichannel sequences that combine both. The check covers subject lines, message bodies, LinkedIn invitation notes, and InMail subject lines. The Preview pane in the step editor is the best way to catch missing-data issues before reaching the launch dialog: switch the prospect selector through a few different prospects in your audience — if any show a blank where a custom field should be, that prospect's data is missing. See /documentation/why-launch-shows-some-prospects-missing-template-data for the full guide with worked examples and frequently asked questions.
Merge tags let you personalize every email for each prospect automatically.
Built-in Tags:
{{firstName}} — Prospect's first name
{{lastName}} — Prospect's last name
{{email}} — Prospect's email address
{{company}} — Company name
{{role}} — Job title / role
{{city}} — City
{{country}} — Country
{{industry}} — Industry
{{website}} — Company website
{{phone}} — Phone number
{{linkedinUrl}} — LinkedIn profile URL
LinkedIn-Specific Tags (in LinkedIn campaigns):
{{headline}} — LinkedIn headline
{{location}} — LinkedIn location
{{jobTitle}} — Job title from LinkedIn profile
{{sender_name}} — Your name (the sender)
Sender Tags:
{{sender_name}} — Your display name
{{sender_email}} — Your email address
{{sender_company}} — Your company name
Custom Fields: When importing prospects via CSV, any column not matching a built-in field becomes a custom field. For example, a CSV column 'department' maps to custom:department, and you can use it as {{custom.department}} or {{department}} in your emails. The {{custom.department}} syntax is recommended (and what the variable picker inserts), but the bare {{department}} shorthand also works.
Custom Fields in Subject Lines: Custom fields from your CSV work everywhere — including the subject line. If you import a CSV with a custom:subject_line column, you can set your entire subject to {{custom.subject_line}} or {{subject_line}}. For fully pre-written emails, your subject line could be just {{custom.subject_line | default: 'Quick question'}} — each prospect gets their own unique subject.
Fallback / Default Values (two ways to write them): A fallback is the value used when a field is empty or missing for a prospect — perfect for a column that's only partly filled in. WarmySender supports two ways to write it, and they do exactly the same thing, so use whichever reads more naturally to you:
1) Long form (the classic way):
{{firstName | default: 'there'}} — renders 'there' if the prospect has no first name.
{{custom.state | default: 'Brazil'}} — renders 'Brazil' if the state column is blank for that prospect.
2) Short form with a double pipe (||):
{{firstName || 'there'}} — same result as above.
{{ custom.state || "Brazil" }} — same result as above.
More examples you can copy and paste:
Hi {{firstName || 'there'}}, — greets by name, or falls back to 'there'.
...companies in {{ custom.state || "your area" }}... — fills in the state, or 'your area' when it's missing.
Subject: A quick idea for {{company || 'your team'}}
Good to know about the short form:
Quotes are optional — {{ custom.state || Brazil }} works too, and multi-word defaults keep their spaces: {{ custom.state || São Paulo }}.
It's only the DOUBLE pipe (||) that means "use this default." A single pipe (|) is a normal formatting instruction and is left exactly as you wrote it — so {{firstName | upcase}} still just uppercases the name.
If a field IS filled in for a prospect, the real value is always used and the default is ignored. The default only kicks in for the blanks.
Best Practices:
Always preview your email before sending to check how merge tags render
Use merge tags in subject lines for higher open rates
Keep personalization natural — don't over-stuff with tags
Test with a small batch first to catch any empty fields
Spintax lets you create multiple text variations within a single email, so every recipient gets a slightly different version. This improves deliverability by making each email unique and helps avoid spam filters.
Syntax: Wrap your alternatives in curly braces, separated by pipes: {Hello|Hi|Hey} — randomly picks one option per send.
Works In:
Subject lines — Yes, fully supported
Email body — Yes, fully supported
Follow-up steps — Yes, each step can use spintax independently
Examples: Subject: {Quick question|Reaching out|Short intro} about {{company}} Body: {Hope you're doing well|Hope your week is going great}, {{firstName}}. {I wanted to reach out|I'm reaching out|I noticed your work} {about|regarding} {a potential collaboration|an opportunity I think you'd find interesting}.
Multiple spintax blocks multiply your variations:
1 block with 3 options = 3 unique versions
2 blocks (3 × 2 options) = 6 unique versions
3 blocks (3 × 2 × 4 options) = 24 unique versions
The variation count is shown in the editor status bar so you can see your total unique combinations at a glance.
Spintax vs Merge Tags:
Merge tags ({{firstName}}) pull data from your prospect's profile — same value every time for that prospect
Spintax ({Hi|Hello|Hey}) randomly picks one option at send time — different each time
You can combine both: {Hi|Hello} {{firstName}}, {hope you're well|how are you?}
Preview & Testing:
The email editor highlights spintax in yellow so you can spot it easily
Use the Preview panel to see how a resolved version looks
Click the Shuffle button (🔀) in the preview to re-randomize and see different variations
Always send a test email to yourself to verify spintax resolves correctly
Processing Order: 1. Merge tags are resolved first ({{firstName}} → 'Scott') 2. Spintax is resolved second ({Hi|Hello} → 'Hello') 3. HTML formatting is applied last
Best Practices:
Use spintax in subject lines — it dramatically improves deliverability by making each email unique
Keep all options natural and interchangeable (don't mix formal and casual in one block)
Avoid nesting spintax inside spintax — only one level is supported
Combine with merge tags for maximum personalization
Aim for 10+ total variations across your email to ensure uniqueness
Don't confuse spintax braces {} with merge tag braces {{}} — single braces with pipes are spintax, double braces are merge tags
A/B testing lets you compare different email variants to find what works best.
How It Works:
When creating a campaign step, add multiple variants — each with its own subject line and body content.
Each variant gets a weight that determines what percentage of prospects receive it (e.g., 50/50 split for two variants).
As emails are sent, the system tracks open rates, click rates, and reply rates for each variant independently.
The variant assignment is stored per prospect for consistent tracking.
Auto-Optimization: WarmySender can automatically pick the winning variant using statistical analysis: • Enable 'Auto-Optimize' on the campaign step • Set a minimum sample size (default: 100 sends) — the system needs enough data before making a decision • Set a confidence level (default: 95%) — how sure the system needs to be • The system uses a chi-squared statistical test comparing reply rates across variants • When statistical significance is reached, the winning variant gets 100% of future sends • Auto-optimize checks run every hour
What to Test:
Subject lines — Usually the biggest impact on open rates
Opening lines — First sentence determines if the email gets read
Call-to-action — Different asks (meeting, reply, link click)
Email length — Short vs. detailed approaches
Personalization level — More vs. fewer merge tags
Where to see the results: Once a step is running with multiple variants, open the campaign's Sequence tab and expand the step to see one row per variant (A, B, C…) with its own Sent, Opened, Clicked, and Replied numbers side by side. To see which variant each individual recipient received, open the Prospects tab — the Variant column sits right next to that person's own Opens and Clicks, and the Prospects CSV export includes it too. See the 'See Opens and Clicks by Email Variant (A/B)' guide for the full walkthrough.
Best Practice: Test one variable at a time for clear results. Start with subject line testing as it has the most measurable impact on open rates.
Sending Window — Set the start and end hours for email delivery:
Default: 9 AM to 5 PM (business hours)
Supports overnight windows (e.g., 10 PM to 6 AM) for different regions
If start equals end, the window is 24 hours (always open)
Timezone — All scheduling is timezone-aware using IANA timezone strings (e.g., 'America/New_York', 'Europe/London'). Emails are sent during business hours in the recipient's timezone if you set it correctly.
Active Days — Choose which days of the week to send:
Default: Monday through Friday (weekdays)
You can enable weekend sending for certain industries
Uses 0=Sunday through 6=Saturday notation
How Scheduling Works:
When a prospect is ready for their next step, the system calculates the scheduled send time (step delay + random jitter)
If the scheduled time falls outside your sending window or on an inactive day, it automatically advances to the next valid time
The system scans up to 8 days ahead to find the next valid slot
Random jitter (1-5 minutes) is added between individual sends to avoid pattern detection
Best Practices:
Send during your prospect's business hours, not yours
Tuesday through Thursday typically have the highest open rates
Avoid Monday mornings (inbox overload) and Friday afternoons (weekend mindset)
Morning sends (8-10 AM local time) tend to perform best
Two things about your cold email campaign are working exactly as intended, even though they sometimes surprise people.
A Running campaign that shows only a few sent (or zero) early on is normal. WarmySender deliberately spreads your emails out gradually across your sending window instead of sending them all at once. So if you check shortly after launching — or early in the window — you may see your campaign marked Running with only a handful sent, or none yet. That's expected and it's a good thing: slow, steady sending is what keeps you landing in the inbox rather than the spam folder, and it protects your sender reputation. There's nothing to fix, restart, or re-launch — the remaining emails keep going out across the rest of the window on their own.
Every time you see for a campaign is in the campaign's chosen time zone — including the next email time. If you set the campaign to one time zone (say New York) but you're checking from another (say London), the next-send time appears in the campaign's zone (New York time), which can look hours off from your local clock. It's correct; it's just labeled in the campaign's time zone so it always matches the window you set.
What a sending window is: A sending window is the daily stretch of hours when your campaign is allowed to send (for example 9:00 AM to 5:00 PM), interpreted in the campaign's chosen time zone. You can also choose which days of the week send. Your emails only ever go out INSIDE your window — never before it opens or after it closes. If a send would fall outside the window, it's automatically held and goes out when your next window opens.
Worked example: A campaign with 300 prospects, a 9:00 AM–5:00 PM window, and the time zone set to New York, launched at 9:00 AM. At 9:05 AM it says Running with only a few sent — normal, the emails are being released gradually. The next-send time shows a New York hour (the campaign's zone). Through the day the sent count climbs steadily, all inside the 9-to-5 New York window. At 5:00 PM the window closes and anyone not yet reached waits for tomorrow's 9:00 AM open.
Change your window or time zone: Open the campaign, go to its schedule settings, and adjust the start and end times, the active days, or the time zone, then save. If you change the time zone, upcoming sends automatically realign to the new window — no need to rebuild or re-enroll anyone.
For the full explainer with FAQ, see the 'How campaign sending windows, time zones & pacing work' guide.
Your cold email campaign decides WHEN each email goes out using three simple rules, all designed to keep you landing in the inbox.
A sending window you choose. You pick the hours (for example 9:00 AM to 5:00 PM) and the days of the week. Emails only ever send inside that window, in the time zone you set for the campaign — never outside it. If a send would fall outside the window, it's automatically held and goes out when your next window opens.
Even pacing across your window. Your emails for the day are now spread out evenly across your WHOLE window instead of firing all at once at the start. Gentle, steady sending is what protects your deliverability — a big burst all at once is a classic spam signal. So checking early shows only a few sent; the rest go out steadily through the day.
A daily limit. Each campaign (and your plan) has a daily cap. Once you reach it, sending pauses for the rest of the day and automatically resumes the next day when your window opens. Any prospects not reached today simply wait their turn tomorrow. This protects your sender reputation.
Worked example: 120 prospects, a 9:00 AM–5:00 PM window (8 hours = 480 minutes) works out to roughly one email every ~4 minutes. At 9:05 AM the campaign says Running with only a couple sent and shows 'Next email ~9:08 AM' — exactly right; the 120 emails trickle out about every 4 minutes all day, always inside the 9-to-5 window.
'Why isn't my campaign sending yet?' It's almost always one of two normal reasons: (a) you launched it after today's window had already closed, so it starts at your next window open (e.g. tomorrow 9:00 AM); or (b) it already reached today's limit, so it resumes tomorrow. A gentler third reason: right at the start of your window it's normal to briefly see zero sent while the even pacing begins. On a Running campaign, an on-screen indicator shows the time of the next scheduled email (e.g. 'Next email ~2:10 PM'), so you always know when the next one goes out.
To send more per day: raise the campaign's daily limit, add more connected mailboxes so volume is shared across senders, widen your window, or move to a higher plan — increasing gradually so your reputation keeps building.
For the full explainer with FAQ, see the 'How campaign sending schedules & pacing work' guide at /documentation/how-campaign-sending-schedule-and-pacing-works.
WarmySender enforces multiple layers of sending limits to protect your deliverability:
Campaign-Level Limits:
Daily send limit — Max emails per campaign per day (default: 100)
Per-mailbox cap — Max sends from a single mailbox per campaign per day (default: 50)
Per-prospect cap — Max emails to one prospect per day (default: 3)
Per-prospect cooldown — Minimum hours between emails to the same prospect (default: 24)
Mailbox-Level Rate Limits:
2 emails per minute per mailbox
40 emails per hour per mailbox
500 emails per day per mailbox (hard cap across all campaigns)
Plan-Level Daily Limits:
Free / Lite: 17 emails/day
Pro: 333 emails/day
Enterprise: 3,333 emails/day
Ultimate: 10,000 emails/day
Provider-Level Limits:
30 emails per minute across all mailboxes on the same provider
600 per hour, 6,000 per day per provider
Domain-Level Limits:
Per-recipient-domain caps prevent over-sending to any single company (e.g., max emails to @google.com per day)
Backoff System: If any rate limit is hit, the system backs off: 1 minute → 5 minutes → 15 minutes → 1 hour. It resets after 30 successful sends within a 60-minute window.
Best Practice: Start with 20-30 emails/day per mailbox for new campaigns and increase gradually. Use multiple mailboxes to scale volume safely.
The 'Minutes Between Sends' setting on a campaign controls how long each individual mailbox waits between its own consecutive sends. It is enforced per mailbox, not globally across the campaign.
What 'Per Mailbox' Means Each mailbox assigned to the campaign enforces the interval independently. If you set a 5-minute interval and have multiple mailboxes assigned, all of them send in parallel — they do not queue behind one another. Each mailbox simply waits 5 minutes between its own sends.
Worked Example Configuration: 5-minute interval, sending window 7 AM – 5 PM (10 hours = 600 minutes), 5 mailboxes assigned, daily send limit 1000. • Each mailbox can send up to 600 / 5 = 120 emails per day. • Across 5 mailboxes running in parallel, the campaign can send up to ~600 emails per day. • The actual number sent is the lowest of: campaign daily send limit, sum of per-mailbox daily caps, and (per-mailbox interval cap × number of active mailboxes).
Why It Is Per Mailbox, Not Global The interval exists to protect mailbox reputation — sending too fast from a single inbox is what triggers spam filters. Different mailboxes are independent inboxes with their own reputations, so there is no deliverability reason to make them wait on one another. Per-mailbox pacing gives you proportionally higher throughput when you add more mailboxes, while keeping every individual mailbox safe.
Cross-Campaign Pacing on Shared Mailboxes If the same mailbox is assigned to two different campaigns, the interval is still honored on that mailbox — campaign A and campaign B cannot fire seconds apart through the same inbox. The system tracks the last send timestamp per mailbox across all campaigns and warmup, so the gap is enforced globally for that inbox even when multiple campaigns share it.
Recommended Values • Established domains and mailboxes: 1–3 minutes is typically safe. • Newer domains or mailboxes still in early ramp: 5–10 minutes is recommended. • Maximum allowed: 60 minutes.
Daily Capacity Estimate (UI Note) The 'Daily Capacity Estimate' shown inside the campaign wizard is conservative and treats the interval as if it applied across the whole campaign. The actual backend behavior is per-mailbox, so when multiple mailboxes are assigned the real sending capacity is higher than the wizard estimate suggests. The authoritative ceilings are the campaign daily send limit, the per-mailbox daily cap, and the per-mailbox rate limits — not the wizard's estimate.
Key Takeaway More mailboxes at the same interval = proportionally more total throughput. The interval setting is about pacing each individual inbox safely, not about throttling the campaign as a whole.
Audience Exclusion Rules keep you from emailing the same people too often. You set the rules once on a campaign, and WarmySender removes anyone who matches BEFORE the campaign sends — so nobody who should be skipped ever gets a message. Exclusion rules only ever REMOVE people from a send; they never add anyone. Leave them off (the default) and your campaign emails everyone you enrolled, exactly as before.
Where to find it: Open the campaign builder (new or existing) and go to the Audience step. Under the exclusions area — right below the option to exclude specific email addresses and domains — you'll find three rules. Set them, save, and they apply the next time prospects are added to that campaign.
The three rules (turn on any combination, or none):
Recently contacted — Enter a number of days (for example 15). Anyone ANY of your campaigns already emailed within that many days is automatically left out. Enter 0 to turn this rule off. A larger number is more cautious (a wider cooldown window); a smaller number lets you re-contact sooner.
Already in another campaign — Select an earlier campaign (or several) whose recipients you want to skip, so a follow-on campaign reaches only the people the first one didn't. Or turn on 'Exclude all my previous campaigns' to skip everyone from every other campaign in your workspace at once, so you only ever reach brand-new people.
On a specific list — Select one or more saved lists to exclude. Everyone on those lists is left out, even if they also appear on the list you're enrolling. Tip: keep a single 'Do not contact' list, exclude it on every campaign, and you have a simple workspace-wide suppression you control from one place.
How the rules combine: If you turn on more than one rule, a prospect is skipped when they match ANY of them. Turning on more rules can only reduce who gets emailed, never increase it.
Bulk-suppress a big list at once: For a long list of addresses or whole domains you never want to email, go to Settings → Blocklist → Import CSV and upload a file with type,value,reason columns (or simple email / domain columns). WarmySender de-duplicates and validates it, shows a preview, and adds the new entries. Blocklisted addresses and domains are skipped by every campaign automatically.
Good to know:
Off by default — existing campaigns are unaffected until you turn a rule on.
Applied before sending — skipped prospects are never emailed; they're filtered out the moment you add them.
Counts shown — when prospects are added, you'll see how many were skipped, so there are no surprises.
Works with the API too — enrolling through the API or an AI assistant applies the same rules, and the response tells you how many were skipped.
Full walkthrough with examples: warmysender.com/documentation/stop-emailing-the-same-prospects-too-often
You just launched a cold email campaign, the status says 'running', but the Sent count still shows 0. Almost always, this is completely normal — and nothing is broken. WarmySender sends your campaign gradually rather than all at once, so right after launch you may see a short stretch of 'running' with little or nothing sent yet while the first emails go out and the rest are paced through the day.
Why campaigns send gradually (and not all at once): Sending a whole list in one burst is one of the fastest ways to land in spam and hurt your domain's reputation. Real people don't fire off hundreds of identical emails in the same minute, and mailbox providers notice when a sender does. To keep you in the inbox, WarmySender deliberately spreads your sends out: • Across your sending window — for example 7am to 5pm. Emails are paced through those hours instead of going out in a single spike. • Across your send days — for example weekdays only. On a day you didn't select, the campaign simply waits. The result is a natural, human-looking sending rhythm that protects your deliverability and your domain reputation over the long run. It's intentional — not a delay or a bug.
The first emails start promptly after launch: You don't have to wait long to see things move. Right after you launch (or resume) a campaign, the first few emails begin going out within a couple of minutes — as long as the current time is inside your sending window and it's one of your send days. The remaining emails are then paced out across the rest of the day. So the typical experience is: launch, see 'running' with 0 sent for a brief moment, then watch the first sends land within a few minutes and the count climb through the day.
Look at the 'Next email' time: The clearest way to confirm your campaign is working is the 'Next email ~time' shown on the campaign. It tells you when the next message is scheduled to go out. If you see an upcoming time there, your campaign is healthy and simply pacing — there's nothing to fix. If that time is later in the day, it just means your sending is spread out, exactly as designed.
What affects how fast your campaign sends:
How many mailboxes are connected — more mailboxes means more sending capacity, so the list moves faster.
Your per-email interval — the gap left between one send and the next. A larger gap is gentler and slower.
Your daily limit — the most emails the campaign will send in a day. Once you hit it, sending pauses until the next day.
Your sending window and send days — the hours and days sending is allowed. Outside your window, or on a day you didn't select, sending pauses and then resumes automatically when you're back inside it.
If it still shows nothing after a while: If your sending window has been open for a while and you still see no sends, check: 1) The campaign has contacts — open the Prospects tab and confirm people are enrolled. 2) At least one mailbox is connected and active — a campaign needs a connected sending mailbox; if your only one is disconnected, reconnect it and the campaign picks back up automatically. 3) The current time is inside your sending window and on a send day — if 'right now' is outside your chosen hours or on a day you didn't select, sending waits until the next valid time (the 'Next email ~time' shows when). If you've checked all three and it still looks stuck, just reply to our support with your campaign name and we'll take a look.
Full walkthrough with examples: warmysender.com/documentation/why-is-my-campaign-running-but-no-emails-sent-yet
Assign multiple mailboxes to a single campaign and WarmySender will automatically rotate between them:
Rotation Modes:
Round Robin (default) — Selects the mailbox with the fewest sends today. This evenly distributes the load across all mailboxes.
Random — Randomly selects from available mailboxes each time.
Weighted — Uses configurable weights per mailbox. A mailbox with weight 3 gets roughly 3x the sends of a mailbox with weight 1.
Mailbox Availability: A mailbox is only used if ALL of the following are true: • It is marked 'Active' on the campaign (you can disable individual mailboxes without removing them) • It is in 'Connected' status (not disconnected or in error state) • It hasn't exceeded its daily per-campaign soft cap • It hasn't exceeded its global daily limit (500 emails/day) • It's not currently rate-limited (in backoff) • It hasn't exceeded the domain daily limit for the recipient's domain
Per-Mailbox Settings (within a campaign):
Weight — Controls rotation priority (default: 1)
Active toggle — Enable/disable without removing
Daily soft cap — Optional per-campaign limit for this mailbox
Capacity Planning: The scheduler pre-calculates available capacity per mailbox before scheduling new sends, accounting for already-sent emails and pending/processing jobs.
Best Practice: Use 3-5 mailboxes per campaign to distribute sending volume and reduce risk. Ensure all mailboxes have a good warmup health score (70+) before assigning them.
WarmySender tracks all key email engagement metrics:
Open Tracking:
A tiny invisible tracking pixel (1x1 PNG) is inserted into each email
When the recipient opens the email and loads images, the pixel fires and records an open event
First-open and repeat-open events are deduplicated for counter accuracy
Tracking tokens are signed with HMAC and expire after 90 days
Where to see who opened: open the campaign, go to the Prospects tab, and check the Opens column — each recipient shows their open count, or a dash if they have not opened it yet. Use the 'Opened' / 'Not opened' engagement filter to narrow the list, or export the CSV for the per-recipient 'Opened' and 'Open Count' columns. Campaign-wide open rate appears in the stat box at the top of the campaign and on the Analytics page. For a full walkthrough, see the 'How to See Which Recipients Opened Your Emails' guide.
Click Tracking:
All links in your email body are automatically wrapped with tracking redirects
When a recipient clicks a link, the click is recorded before redirecting to the original URL
Mailto: links, tel: links, and unsubscribe links are excluded from wrapping
Click events are deduplicated per prospect per campaign step
Reply Tracking:
Replies are detected via IMAP inbox sync — WarmySender scans your inbox for incoming messages
Replies are matched to active campaign enrollments
When a reply is detected, the prospect is automatically marked as 'replied'
If 'Stop on Reply' is enabled (default), the prospect is removed from further follow-ups
Cross-channel: email replies also stop LinkedIn campaign sequences
Bounce Detection:
Bounced emails are classified automatically
Important: Gmail 550-5.4.5 errors are classified as rate limits, not bounces — this prevents false campaign cooldowns
Unsubscribe Handling:
An unsubscribe link is added to your email footer
RFC 2369 and RFC 8058 compliant List-Unsubscribe headers are included
When a prospect unsubscribes, they are added to your suppression list and stopped from all campaigns
Custom Tracking Domains: Set up a custom CNAME tracking domain (e.g., track.yourdomain.com) from Settings > Tracking Domains for better deliverability. See the 'Tracking Domains' guide below.
Yes — WarmySender shows you which recipients opened your campaign emails, and how many times. Open tracking is built into every cold email campaign and is turned on by default. The opens you see reflect your real prospects: WarmySender automatically leaves out your own opens (for example, opening a sent email in your Sent folder to re-read it) and obvious automated opens from security scanners, so your numbers are not inflated by your own activity. Open tracking is a strong directional signal rather than an exact headcount — see the accuracy note below for why.
Where to see who opened (step by step):
Go to Campaigns and click the campaign you want to check.
Open the Prospects tab — this lists every recipient enrolled in the campaign.
Look at the Opens column (the eye icon). Each recipient shows a green badge with the number of times they opened your email, or a dash if they have not opened it yet.
To see only the people who opened, use the engagement filter above the list and choose 'Opened'. Choose 'Not opened' to find everyone who has not opened yet — handy when planning a follow-up.
To work with the data outside the app, click Export and open the CSV. It includes an 'Opened' (Yes/No) column and an 'Open Count' column for every recipient.
Campaign-wide open numbers:
The stat box at the top of the campaign shows your Open Rate for the whole campaign (all-time, and it refreshes on its own); the raw open totals live in the Prospects tab and in the Analytics funnel below.
The Analytics page shows open rate across all your campaigns over a date range (7, 14, 30, or 90 days), plus an engagement funnel: Sent, then Opened, then Clicked, then Replied.
How open tracking works: A tiny invisible image (a 1x1 tracking pixel) is added to each campaign email. When the recipient opens your email and their email app loads images, that pixel records an open. Both first opens and repeat opens are counted, so the Open Count reflects how many times each person returned to your message.
Turning it on or off: Open tracking is on by default. You can toggle Track Opens (and Track Clicks) per campaign in the campaign's tracking settings when you create or edit a campaign.
A note on accuracy (please read): Open tracking is an industry-standard signal, but no pixel-based open tracking is ever 100% precise — so treat Open Rate as a strong directional signal, not an exact count: • Your own opens are not counted. If you open a sent email in your Sent folder to re-read it, re-read it several times, forward it to a teammate on your own side, or open it on your phone right after sending, WarmySender recognizes that as you (not the prospect) and leaves it out — automatically, with nothing to configure. • Corporate security scanners sometimes open links and images automatically before a human ever sees the message, which can push raw numbers up. WarmySender recognizes common scanner patterns (such as one source firing opens for many recipients at once), filters them out of your displayed numbers, and caps Open Rate at 100%, so you never see an impossible figure. • Some recipients and providers — for example, Apple Mail with Privacy Protection — block or pre-load images, which can hide a real open. A prospect can genuinely read your email without it registering, so your true open rate is often a little higher than any tool can show. • Because WarmySender errs on the conservative side (it would rather let a borderline open through than risk hiding a real prospect open), a small amount of scanner noise can remain. Clicks are filtered the same way (your own test-clicks are excluded) and, being a deliberate action, are a stronger signal than opens. Treat Reply Rate as your most reliable measure of genuine interest. • For the full plain-language explanation of which opens and clicks count (with worked examples) and how to turn open & click tracking on or off per campaign, see /documentation/accurate-open-and-click-tracking.
Is this the same as warmup? No. Open tracking is a campaign feature — it tells you when your real prospects open your outreach. Email warmup is a separate system that builds your sender reputation in the background; it does not track recipient opens. If you want to know who opened your outreach, send it as a campaign as described above.
Don't have a campaign yet? Open tracking starts working the moment you send your first campaign. See 'Getting Started with WarmySender' and 'Setting Up Your First Campaign' to set one up.
If a campaign step has more than one A/B variant, WarmySender shows you how each variant performs and which variant every recipient received — without exporting and cross-referencing by hand.
Per-variant performance (Sequence tab):
Open the campaign and go to the Sequence tab.
A step with multiple variants shows a 'variants' badge. Click the step row to expand it.
You'll see one row per variant (A, B, C…), each with its own Sent, Opened, Clicked, and Replied numbers and percentages. The Clicked column sits right next to Opened, so you can compare at a glance which subject line or body drove the most opens and the most clicks.
The step's header row shows the combined totals across all variants.
Which variant each recipient received (Prospects tab):
In the same campaign, open the Prospects tab.
The Variant column shows the variant each recipient was sent (A, B, C…), positioned right before the Opens and Clicks columns. A dash means that recipient hasn't been sent into a variant step yet (for example, they're still scheduled).
Because Variant sits next to that recipient's own Opens and Clicks, you can read engagement per person, per variant, directly in the table.
Export everything to a spreadsheet: Click Export on the Prospects tab. The CSV includes a Variant column alongside Opened, Open Count, Clicked, and Click Count for every recipient — so you can build your own pivot of opens and clicks by variant in Excel or Google Sheets.
Good to know:
Variant assignment is sticky — once a recipient is placed in a variant, they stay in it for the rest of the sequence, so the numbers stay consistent.
These columns appear for cold email (and the email side of multichannel) campaigns, with open and click tracking on (it's on by default).
Want the system to pick the winning variant for you automatically? See the 'A/B Testing & Auto-Optimization' guide.
If you save the email copy you reuse as Templates, WarmySender can tell you which ones actually work. The Analytics → Templates view rolls up real performance — how many sends, what share got opened, what share replied, and how many of those replies were positive — for every template, side by side. Instead of guessing which subject line or pitch lands, you can see it.
Where to find it: Open Analytics from the left sidebar and choose the Templates tab. You'll see one row per saved template with its performance numbers. Use the date range at the top of the Analytics page (7, 14, 30, or 90 days) to choose the window the numbers cover.
What the numbers mean (over the date range you picked):
Sends — how many emails went out using this template.
Open rate — the share of those emails that were opened (a tiny invisible image records an open when the recipient's email app loads images).
Reply rate — the share that got a reply back. This is the most reliable signal of genuine interest.
Positive reply rate — the share of replies that were interested or warm (rather than a decline or an out-of-office). Use this to separate 'got a reply' from 'got a good reply.'
Higher open rate usually points to a stronger subject line; higher reply and positive-reply rates point to copy that resonates. Comparing two templates head to head is the fastest way to learn what your audience responds to — then lean into the winner.
Why a template might show zeros (and that's expected): Template performance starts at zero and fills in going forward, once you build campaigns from a saved Template. So you'll see zeros in these normal situations: • A brand-new template you just created but haven't used in a campaign yet — there's nothing to measure until it sends. • A template you've never reused — if the copy in a campaign was written from scratch (not started from a saved template), those sends aren't attributed to any template. • Campaigns you built before this — historical campaigns that weren't started from a saved template don't have a template to roll up to.
None of these mean anything is broken. To start collecting numbers on a template, build your next campaign from it: when you write a step's email, choose the saved template as the starting point. From then on, every send, open, click, and reply from that step counts toward the template's row in Analytics → Templates. The numbers refresh on their own — give a new campaign a little time after it starts sending and the row will begin to populate.
How to get the most out of it:
Save the copy you reuse as templates — only saved templates get their own performance row.
Build campaigns from those templates rather than pasting fresh copy, so the results roll up where you can compare them.
After a couple of weeks of sending, sort by reply rate or positive reply rate, reuse the templates that win, and rewrite the ones that consistently underperform.
A note on accuracy: open tracking is an industry-standard signal but never perfectly precise — some providers (for example, Apple Mail with Privacy Protection) block or pre-load images, and corporate scanners can open messages automatically. WarmySender filters known scanners and caps open rate at 100%, so treat open rate as a strong directional signal and reply rate as your most trustworthy measure. For per-recipient opens, see the 'How to See Which Recipients Opened Your Emails' guide.
You won't lose your campaign setup. As you build a campaign in WarmySender, your work is saved automatically as you go — and it's saved to your account, not just to one browser. A small 'Draft saved' indicator confirms your progress is being kept. If you accidentally refresh the page, close the tab, lose your connection, hit an error while creating the campaign, or even move to a different computer or browser, your draft is still there.
The 'Resume your draft?' prompt: The next time you open the campaign builder (Campaigns > New Campaign), WarmySender notices you have a draft and asks what to do: • Resume draft — loads your in-progress campaign back into the builder, with every step, message, mailbox/LinkedIn selection, and attached list restored exactly as you left them. • Start fresh — sets the draft aside and gives you a clean, empty builder.
Nothing is decided for you — the draft simply waits until you choose. And because your draft is kept with your account, the prompt finds it even if you sign in from a different computer or browser than the one you started on.
What gets saved as you build:
Your campaign name and settings
Your steps and sequence (email steps + LinkedIn actions, wait times, branching)
Your message content (subjects, body copy, personalization variables)
Your selected mailboxes, LinkedIn accounts, and attached audience/prospect list
Good to know:
A draft is inert — it never sends anything and has zero effect on your daily limits, warmup, or ramp. Nothing reaches a prospect until you finish the campaign and click launch.
Your draft is kept with your account, so it's available wherever you sign in — the same computer, a different one, or a different browser. Switch machines mid-build and your work follows you.
For the full walkthrough with a worked example, see the 'Your campaign draft is saved automatically' guide.
If a prospect in your campaign shows the status 'Bounced', it means WarmySender detected that an email to that address could not be delivered, and stopped sending to it for you. This protects your sender reputation — repeatedly emailing an address that doesn't work is one of the fastest ways to hurt deliverability for your whole list.
Two kinds of bounce we catch automatically:
Immediate rejections at send time — when the receiving mail system refuses the email the moment you try to send (for example, the address clearly doesn't exist). WarmySender marks the prospect Bounced right away.
Delayed 'delivery failure' notices — when the email is accepted first and a delivery-failure notice arrives in your sending inbox a little later (minutes or hours afterward) to say it ultimately couldn't be delivered. WarmySender watches for these, matches each one back to the right prospect, and marks them Bounced too. This is the part that's easy to miss by hand.
Where to see it: Open the campaign and go to the Prospects tab. Bounced addresses are clearly marked 'Bounced', and you can filter the list by status to see all of them in one place. The campaign's overall stats reflect bounces too.
Bounced prospects are excluded from future sends: Once a prospect is marked Bounced, WarmySender automatically stops sending to that address — both for the remaining steps of the current campaign and for future sends — so you never keep hitting a known-bad address.
Best practice: start with clean, verified lists so there are fewer bad addresses. Automatic bounce handling is your safety net for the ones that slip through. For the full explanation with an example, see the 'Why a prospect was automatically marked as bounced' guide.
When some of your cold emails don't reach their recipients, the Delivery Issues view shows you exactly which ones and why. It lives in the unified inbox's left sidebar on the Campaigns tab, right next to Campaigns and Needs Reply — so 'what happened to my sends?' is answered in the same place you check for replies.
How to find it: Inbox → Campaigns tab → Delivery Issues (left sidebar). Each row is one affected recipient and shows their email, which campaign it came from, which mailbox sent it, a plain-language status, a short reason, and the date.
Two kinds of delivery issue:
Bounced — the recipient's mail server rejected the address. It may be inactive, mistyped, or no longer exists. This is about who you're sending to, not your mailbox. What to do: fix a typo on the Prospects page, or remove the address if it's genuinely gone — trimming dead addresses also protects your sender reputation.
Couldn't send — the receiving mail server turned the message away even though the address may be fine. This is usually a temporary spam or connection block, not a bad address. What to do: usually nothing — it typically clears up on its own while your other sends keep going. Keep Email Warmup running to build the trust that gets your mail welcomed into the inbox.
Worked example: you send to 500 people and later see 12 rows marked Bounced and 3 marked Couldn't send. The 12 Bounced are an audience-quality task — fix or remove those addresses. The 3 Couldn't send are usually nothing to act on, and the other 485 sends carry on normally.
An empty view is good news: for most healthy campaigns Delivery Issues is empty and shows 'No delivery issues — all your sends are landing.' Seeing nothing here means nothing went wrong.
Email only: this view is strictly about email delivery. LinkedIn and Instagram outreach have their own separate signals and never appear here, so an empty view is a clean bill of health for your email sending specifically.
For the full walkthrough with examples and FAQs, see /documentation/how-to-see-emails-that-didnt-get-delivered. Related: 'Bounce Shield Protection', 'Managing Prospects & Contacts'.
Good news first: we fixed an issue that could stop very large contact lists (about 5,000 contacts or more) from starting to import. If you tried to import a big list and saw "Failed to start import. Please try again," the problem is resolved — just open your list and import it again, and it will start normally. Smaller lists were never affected. If you run into anything unexpected, reach out and we will help right away.
How large imports work:
When you import a contact list, WarmySender checks the file and brings your contacts in. Smaller lists finish almost instantly. Very large lists — roughly 5,000 contacts and up — are brought in for you in the background so you are never left staring at a frozen screen. After you start a big import you will see a progress bar at the top of the Contacts page, and you are free to keep working in the rest of the app while it runs. When it is done, the count updates and your new contacts are ready to use. You do not have to keep the page open or wait around for it to finish.
Preparing your file for a smooth import:
Use a CSV file. A simple comma-separated file exported from a spreadsheet (Google Sheets, Excel, Numbers) or your CRM works best.
Keep a header row. The first row should name your columns — for example Email, First Name, Last Name, Company — so we can map them correctly. Email is the most important column.
Clean, plain values. Make sure email addresses are in their own column and avoid stray characters or merged cells.
Duplicates are handled for you. If the same email appears more than once in your file, or a contact is already in your account, we recognize it and will not create a second copy — so it is safe to import a list even if it overlaps with contacts you already have.
Very large files can take a few minutes. A list of tens of thousands of contacts is no problem; it just runs in the background and the progress bar keeps you posted.
A few things to expect:
You can keep using WarmySender while a big import runs — set up a campaign, check your warmup, or browse other contacts. The import keeps going on its own.
The progress bar shows how far along the import is and updates as it works through your file.
Once the import finishes, your contacts are immediately available to add to a campaign.
Frequently asked questions:
Is there a limit to how many contacts I can import? There is no small cap — you can import very large lists, including tens of thousands of contacts at once. Large lists simply import in the background and may take a few minutes to finish.
My large import said "Failed to start import" — what do I do? This was a known issue with very large lists and it has been fixed. Please open your list and start the import again; it will begin normally. If it still does not start, contact us at [email protected] and we will sort it out quickly.
How do I know when a big import is finished? Watch the progress bar at the top of the Contacts page. When it completes, your contact count updates and the new contacts are ready to use — there is nothing else you need to click.
Can I keep using the app while it imports? Yes. Large imports run in the background, so you can keep working anywhere in WarmySender while your contacts are brought in. You can even close the page and come back later.
Will importing the same list twice create duplicate contacts? No. We automatically recognize emails that are already in your account or repeated within your file, so re-importing will not create duplicate contacts.
What file format should I use? A CSV file with a header row works best. Make sure your email addresses are in their own column. Most spreadsheet apps and CRMs can export a CSV in a couple of clicks.
Still have a question about importing? Open warmysender.com/documentation, click "Copy Prompt to Clipboard," and paste it into an AI assistant like Claude or ChatGPT along with your question — or email us at [email protected] and we will help.
WarmySender supports inserting images into your campaign emails using the Insert Image button in the email editor toolbar.
How to Insert an Image: 1. In the campaign email editor, click the Image icon (mountain/sun icon) in the toolbar. 2. Paste the URL of your image (must be a publicly accessible HTTPS URL). 3. Optionally add alt text (recommended for accessibility and email clients that block images). 4. Optionally set a width (e.g. 600 for full-width, 300 for half-width). 5. Click 'Insert Image' — the image appears inline in your email.
You can also insert images in code view by typing an <img> tag directly, for example: <img src="https://yoursite.com/image.png" alt="Description" width="600" />
Where to Host Your Images: Images must be hosted on a publicly accessible URL. You do not upload images to WarmySender — instead, host them on your own website, a CDN, or a free image hosting service: • Your company website or CDN (best option for brand consistency and reliability) • Google Drive (set sharing to 'Anyone with the link', then use the direct link) • imgbb.com (free, no account required) • Imgur (free for public images) • Any web server that serves images over HTTPS
Image Best Practices for Cold Email:
Keep images under 100KB — large images slow loading and may trigger spam filters.
Use HTTPS URLs — many email clients block HTTP images or show security warnings.
Maximum width: 600px — email clients render at 600-640px max width. Use width="600" for full-width images.
Use JPEG for photos, PNG for logos/graphics with transparency.
Avoid WebP — Outlook desktop does not support it.
Always add alt text — many email clients block images by default. Alt text shows when images are blocked.
Avoid GIFs in cold outreach — they increase email size and can hurt deliverability.
Deliverability Considerations:
Maintain an 80/20 text-to-image ratio — emails that are mostly images trigger spam filters.
Avoid images in the first email of a cold sequence — text-only first emails perform best for deliverability.
Limit to 1-2 images per email — each image is an external resource request that spam filters track.
Never send image-only emails — always include substantial text content alongside images.
A small logo in your email signature is generally safe and does not significantly impact deliverability.
Common Use Cases:
Company logo in email signature
Product screenshots in follow-up emails
Infographics or charts (after initial engagement)
Banner images for event invitations
Note: WarmySender does not support file attachments (PDFs, documents, etc.) in campaign emails — link to a hosted file instead. You can attach files to a reply you send from the Unified Inbox, though. See the 'Email Attachments: Replies Yes, Campaigns No' guide for the full picture.
There are two answers here, and the difference matters:
REPLIES — YES. You can attach files to a reply you send from the Unified Inbox. Click the paperclip in the reply box, or drag files straight onto the conversation. Up to 5 files, up to 10 MB each, and about 11 MB of files in total per reply. Full details: https://warmysender.com/documentation/how-do-i-attach-a-file-to-an-inbox-reply
CAMPAIGN AND COLD OUTREACH EMAILS — NO, and that is deliberate. Attachments are not supported on campaign emails and won't be.
Why campaign emails don't take attachments:
An attachment arriving from a sender the recipient has never exchanged mail with is one of the strongest spam signals Gmail and Outlook weigh.
Allowing it would drag a whole campaign toward the spam folder — including the messages that had nothing attached.
File size also slows delivery and can trip provider rate limits.
For cold outreach specifically, recipients are wary of files from strangers, so attachments tend to hurt responses rather than help them.
What to do instead in a cold email:
Link to a hosted file — put your PDF, brochure, or document on your own website, a shared drive, or a cloud folder, and include the link. This is the safest approach and you can update the file after sending.
Use a landing page — a simple page with your content, linked from the email. This also shows you who visited.
Put the key points in the body — instead of attaching a proposal or one-pager, write the two or three lines that matter directly in the email.
Send the file once they reply — the moment a prospect writes back, you're in a conversation, and you can attach files to your reply straight from the Unified Inbox.
What you can attach to a reply: PDF, Word, Excel, PowerPoint, plain text, Markdown and CSV files, plus images (JPEG, PNG, GIF, WebP). Programs and installers, macro-enabled Office files, archives (zip, rar, 7z) and web or script files are blocked, because inbox providers and corporate filters routinely strip or block messages carrying them — so blocking them here is what makes sure your reply actually arrives. If your file is one of those, or it's over the size limit, share it as a link instead.
Best Practice: treat your first cold email as a conversation starter, not a presentation. Save the detailed materials for after you have the prospect's attention — which is exactly when reply attachments become available to you.
Note: If you want to add inline images (logos, screenshots, banners) to your campaign emails, WarmySender does support this — see the 'Images in Campaign Emails' guide for details.
You can attach files to a reply you send from the Unified Inbox — a message back to someone who already wrote to you. Campaign and cold outreach emails still don't take attachments, on purpose (see the 'Email Attachments: Replies Yes, Campaigns No' guide for why).
How to attach:
Click the paperclip in the reply box and pick your files, or
Drag files straight from your desktop onto the conversation — a drop zone appears the moment you start dragging.
Drag-and-drop now works in your LinkedIn and Instagram inboxes too.
The composer shows a running count and size (for example '2 of 5 files'), so you always know how much room is left, and you can remove any file before you send.
The limits:
Up to 5 files per reply.
Up to 10 MB per file.
About 11 MB of files in total per reply. The total is smaller than 5 x 10 MB because email has to repackage files so they can travel inside a message, and that repackaging makes them noticeably bigger in transit. The ceiling is set on the packaged size, and the headroom is deliberate — it keeps your reply comfortably under what mainstream inbox providers accept, so it lands instead of bouncing back.
File types you can send: PDF, Word, Excel, PowerPoint, plain text, Markdown and CSV, plus images in JPEG, PNG, GIF and WebP.
Blocked for safety: programs and installers, macro-enabled Office files, archives (zip, rar, 7z) and web or script files. These are the file types attackers use to carry malware, so inbox providers and corporate mail filters routinely strip or block any message carrying them — turning them away here is what makes sure your reply actually arrives. Renaming doesn't get around it: the check looks at what a file genuinely is, not just the letters after the dot. And because archives are blocked, zipping is not a workaround — share a link or send it in a follow-up instead.
Where to find a file you already sent: in your own mailbox's Sent folder. Every file you attach is delivered to your recipient exactly like any other email attachment, and the copy in your Sent folder is your record of what went out. Re-downloading a sent file from inside the WarmySender thread view isn't available yet.
When a link beats an attachment, even on a reply: anything over the size ceiling, or a recipient behind a strict corporate filter.
Full guide with worked examples and FAQ: https://warmysender.com/documentation/how-do-i-attach-a-file-to-an-inbox-reply
WarmySender allows you to set a unique email signature for each mailbox and insert it into your campaign emails using the {{signature}} merge tag.
Setting Up Your Signature: Each mailbox has its own signature, configured in the mailbox settings dialog under the Signature tab. Go to Email Infrastructure > Mailboxes, click the three-dot menu (⋮) on any mailbox, select "View Details", and go to the Signature tab. Signatures support both plain text and HTML, so you can include formatted text, links, or simple styling.
Using {{signature}} in Campaign Emails: In the campaign editor, insert the {{signature}} variable from the variable picker (or type it manually). When the email is sent, {{signature}} is replaced with the signature stored on the sending mailbox. If a campaign rotates across multiple mailboxes, each recipient automatically gets the correct signature for whichever mailbox sends their email.
Different Signatures per Mailbox: Since signatures are stored per-mailbox, you can have a different signature for each mailbox without creating separate campaigns. Simply set each mailbox's signature in its Signature tab, then use {{signature}} in your template — the system handles the rest.
Signature Best Practices:
Keep signatures short — 3-5 lines maximum for cold outreach.
Include your name, title, company, and one contact method (phone or LinkedIn).
Avoid images in signatures for cold outreach — they can trigger spam filters and increase email size.
Avoid large HTML signatures with logos and social icons in initial outreach.
You can also use sender merge tags ({{sender_name}}, {{sender_company}}) alongside or instead of {{signature}} for automatic personalization.
Test your signature renders correctly by using the 'Send Test' feature in the campaign editor.
Note: Signatures are not automatically appended — you must include {{signature}} in your email template body where you want the signature to appear.
Better targeting leads to higher reply rates. Here is how to segment your audience effectively.
Why Segment? • Personalized messaging for each segment increases reply rates by 2-3x. • Different roles need different value propositions (CEO vs. VP Sales vs. Manager). • Industry-specific pain points resonate more than generic pitches.
Segmentation Strategies:
By Role/Seniority:
C-Suite (CEO, CTO, CFO) — Focus on business outcomes, ROI, strategic value. Keep emails very short.
VP/Director — Focus on departmental impact, team efficiency, competitive advantage.
Manager — Focus on day-to-day pain points, ease of use, time savings.
By Industry:
Create industry-specific email templates referencing common challenges.
Use industry merge tags: 'In the {{industry}} space, we have seen...'
Revive cold prospects who did not respond to your initial campaign.
When to Re-engage:
30-60 days after your initial campaign completed with no reply.
After a significant product update or new feature launch.
When you have new social proof (case study, testimonial) relevant to their industry.
Around business milestones (new quarter, budget season, industry events).
Re-engagement Strategy:
Filter your prospect list to contacts who were 'contacted' but never 'replied'.
Create a NEW campaign (do not re-enroll in the old one).
Use a fresh angle — different subject line, different value proposition.
Reference the previous outreach: 'I reached out a few weeks ago about...' (honesty works).
Keep it shorter than your original sequence — 2-3 steps maximum.
Effective Re-engagement Templates:
The 'New Development' Email: 'Hi {{firstName}}, I reached out last month about [topic]. Since then, we have [new development/case study/feature]. Thought it might be relevant to {{company}} now.'
The 'Quick Question' Email: 'Hi {{firstName}}, is [problem area] still a priority for {{company}} this quarter? Happy to share how we are helping [similar companies] with it.'
The 'Breakup' Email: 'Hi {{firstName}}, I have reached out a couple of times and have not heard back. I completely understand if the timing is not right. Should I check back next quarter, or is this not relevant?'
Best Practices:
Wait at least 30 days between campaigns to the same prospect.
Change your approach — if the first campaign was problem-focused, try a case-study approach.
Use a different mailbox or at least a different subject line pattern.
Respect the per-prospect cooldown settings.
Remove prospects who bounced, unsubscribed, or were marked DNC from re-engagement lists.
Track re-engagement reply rates separately to measure what revival approaches work best.
Send fully unique, pre-written emails to each prospect — where every part (subject, opening line, body, CTA) is a variable pulled from your CSV.
Overview: This approach is ideal when you have already crafted unique emails for each prospect using AI tools, manual research, or copywriting. Instead of writing one template with a few merge tags, every element of the email is a custom field. WarmySender sends each prospect their own fully personalized message.
Step 1: Prepare Your CSV Add columns for every part of the email using the custom: prefix:
email,firstName,company,custom:subject_line,custom:first_line,custom:second_paragraph,custom:cta [email protected],John,Acme Corp,Quick question about Acme's Q1 growth,I saw your talk at SaaStr...,We help companies like Acme reduce churn by 30%...,Would you be open to a 15-min call next week? [email protected],Jane,Globex,Loved your recent blog post,Your article on remote hiring resonated...,We built a tool that cuts hiring time by 40%...,Could I send you a quick demo video?
Key rules for CSV headers:
Prefix custom columns with custom: (e.g., custom:subject_line).
Field names are sanitized: lowercased, spaces/special chars become underscores, max 30 characters.
Use only alphanumeric characters and underscores after the prefix.
Step 2: Import Prospects 1) Go to your campaign > Prospects > Import CSV. 2) Upload your file. Built-in columns (email, firstName, company) auto-map. 3) Custom columns appear as 'Custom: subject_line', 'Custom: first_line', etc. 4) Confirm the mapping and import.
Step 3: Create Your Campaign In the email editor, use variables for every part:
Subject line: Click the subject field, then use the Variable Picker (the { } button in the toolbar) to insert {{custom.subject_line}}.
Body example: {{custom.first_line}}
{{custom.second_paragraph}}
{{custom.cta}}
Best regards, {{sender_name}}
Both {{custom.field_name}} and {{field_name}} syntax work, as long as the name does not conflict with a built-in field.
Step 4: Add Fallback Values Protect against missing data with a fallback — the value shown when a custom field is blank for a prospect. You can write it two equivalent ways; pick whichever reads better: • Long form: {{custom.subject_line | default: 'Quick question for you'}} • Short form (double pipe): {{custom.subject_line || 'Quick question for you'}} Body examples: • {{custom.first_line | default: 'I came across your company and was impressed by your work.'}} • {{custom.first_line || 'I came across your company and was impressed by your work.'}} Both produce the same result — the real value when the field is filled in, the fallback when it's blank — so every prospect gets a coherent email even if a custom field is empty. (Quotes are optional in the short form, and a single pipe like {{firstName | upcase}} is a normal formatting instruction, left untouched.)
Tips and Best Practices:
Test with a small batch (5–10 prospects) first to verify variables resolve correctly.
Send a test email from the final campaign step — when your campaign already has contacts, the test uses a real sample contact's data (their actual name and custom fields), so you see a true-to-life preview instead of placeholder text. Add a couple of contacts before testing to get the most realistic result.
Use the Preview feature to check each prospect's rendered email before launching.
Custom fields appear in the Variable Picker under the 'Custom Fields' group.
Combine with spintax for additional variation: {Hi|Hello} {{firstName}}, {{custom.first_line}}
You can have as many custom columns as you need — there is no limit on the number of fields.
Common Mistakes to Avoid:
Forgetting the custom: prefix in CSV headers — without it, unrecognized columns are skipped.
Using spaces in field names — use underscores instead (custom:first_line, not custom:first line).
Not adding fallback values — if even one prospect is missing a field, they get a blank in the email.
Exceeding 30 characters for field names — keep names short and descriptive.
Create and manage email campaigns programmatically using the WarmySender API.
Required Scope: campaigns:write (for campaign CRUD), enrollments:write (for enroll/unenroll) Create an API key with the needed scopes in Settings > API Keys.
Campaign Lifecycle via API:
Create a campaign (POST /api/v1/campaigns) — always created in draft status
Review and adjust settings (PATCH /api/v1/campaigns/:id)
Enroll prospects (POST /api/v1/campaigns/:id/enrollments) — accepts prospectIds, listIds, or emails
Start the campaign (POST /api/v1/campaigns/:id/start)
Monitor progress (GET /api/v1/campaigns/:id)
Pause if needed (POST /api/v1/campaigns/:id/pause)
Unenroll prospects (DELETE /api/v1/campaigns/:id/enrollments) — remove specific prospects from a running campaign
Creating Prospects with LinkedIn URL: POST /api/v1/prospects supports a linkedinUrl field for multichannel outreach: • email (required), firstName, lastName, company, role, phone, linkedinUrl, customFields (object) • The linkedinUrl field accepts any valid LinkedIn profile URL • Deduplication is by email — if the email exists, the existing prospect is returned
Creating a Campaign: POST /api/v1/campaigns requires: • name — Campaign name (required) • steps — Array of email steps with subject, bodyHtml, and stepIndex (at least 1 required) • mailboxIds — Array of connected mailbox IDs to send from (at least 1 required) • Optional: prospectIds, dailySendLimit, timezone, scheduleDays, trackOpens, trackClicks, stopOnReply, stopOnBounce, startDate, endDate
Key Rules:
Campaigns are always created in draft status — you must explicitly start them.
Step 0 always has delayDays=0 (sends immediately). Other steps default to 1 day delay.
All mailboxes must be connected and have sending enabled.
Prospects with bounced, unsubscribed, or suppressed status are automatically marked as suppressed in the enrollment.
The API supports email, linkedin, and multichannel campaigns via the channel field (defaults to email).
Updating a Campaign: PATCH /api/v1/campaigns/:id — only works on draft or paused campaigns. You can update name, dailySendLimit, sendingWindowStart/End, scheduleDays, tracking settings, and dates.
Starting a Campaign: POST /api/v1/campaigns/:id/start checks: • Campaign has at least one step and one mailbox. • End date (if set) has not passed. • Your subscription is active. • If startDate is in the future, campaign is set to 'scheduled' instead of 'running'.
Pausing a Campaign: POST /api/v1/campaigns/:id/pause — works on running or scheduled campaigns. Sets pausedReason to 'api'.
Enrolling Prospects: POST /api/v1/campaigns/:id/enrollments — add prospects to a campaign. • Request body: { prospectIds?: string[], listIds?: string[], emails?: string[] } — pass at least one. • prospectIds: directly enroll specific prospects by ID. • listIds: enroll all prospects from one or more prospect lists. • emails: find and enroll prospects by email address. • You can combine all three in a single request. • Requires enrollments:write scope.
Unenrolling Prospects: DELETE /api/v1/campaigns/:id/enrollments — remove prospects from a campaign. • Request body: { prospectIds?: string[], emails?: string[] } — pass one or both. • Response: { data: { unenrolledCount: number, totalProcessed: number } } • Prospects not currently enrolled are skipped (counted in totalProcessed but not unenrolledCount). • Use case: unenroll when a prospect replies on another channel (e.g., WhatsApp, LinkedIn) to avoid duplicate outreach.
Idempotency: The create endpoint supports the Idempotency-Key header for safe retries. Use a unique key per creation request.
Full API Reference: warmysender.com/docs/integrations
Common errors when using the Campaign API and how to resolve them.
400 validation_error — Invalid Request Body Cause: Missing required fields or invalid values. Common issues: • 'name' is required and must be 1-200 characters • 'steps' array must have at least 1 step and at most 50 • 'mailboxIds' array must have at least 1 mailbox ID • 'dailySendLimit' must be between 1 and 10,000 • Each step must have a unique 'stepIndex' (duplicates are rejected) • 'endDate' must be in the future and after 'startDate' Fix: Check the error response 'details' field for specific validation failures.
400 unusable_mailboxes — Mailbox Not Usable Cause: One or more mailboxes are disconnected or have sending disabled. Fix: Go to Settings > Mailboxes and reconnect the mailbox. Ensure 'Sending Enabled' is turned on.
400 invalid_status — Wrong Campaign Status Cause: Attempting an action not allowed for the current status. • Cannot update a running campaign — pause it first (POST /:id/pause) • Cannot start a completed or errored campaign • Cannot pause a draft or already-paused campaign Fix: Check the campaign status with GET /api/v1/campaigns/:id first.
400 end_date_expired — End Date Has Passed Cause: Trying to start a campaign whose end date is already in the past. Fix: Update the end date (PATCH) or set it to null to remove it.
403 insufficient_scope — Missing API Key Scope Cause: Your API key does not have the required scope. • Creating/updating/starting/pausing: requires campaigns:write • Reading campaign data: requires campaigns:read • Enrolling prospects: requires enrollments:write Fix: Create a new API key with the needed scopes in Settings > API Keys.
403 subscription_blocked — Subscription Issue Cause: Your subscription is inactive, past due, or expired. Fix: Visit Settings > Billing to update your payment method or renew.
404 not_found — Campaign Not Found Cause: The campaign ID does not exist, belongs to a different workspace, or was deleted. Fix: Verify the campaign ID. Use GET /api/v1/campaigns to list all campaigns.
409 conflict — Duplicate Data Cause: Duplicate prospect enrollment (same prospect already enrolled in this campaign). Fix: Check existing enrollments before enrolling. Use the Idempotency-Key header for safe retries.
429 Too Many Requests — Rate Limited Cause: Exceeded 60 requests per minute. Fix: Implement exponential backoff. Wait and retry after the rate limit window resets.
Idempotency Tips:
Use the Idempotency-Key header on POST /api/v1/campaigns for safe retries
Each unique key caches the response for 24 hours
If your request times out, retry with the same key — you will get the cached result, not a duplicate campaign
Generate keys using UUIDs (e.g., crypto.randomUUID())
Sometimes campaign prospects are marked as 'Failed' with the error 'stuck in processing loop after 3+ recovery cycles'. This guide explains what this means and how to prevent it.
What Is a Stuck Processing Loop? When a campaign sends an email, it creates a 'send job' that goes through these states: pending → processing → completed. If a job gets stuck in the 'processing' state for more than 10 minutes (for example, because the sending mailbox hit its daily limit or was temporarily unavailable), the system's recovery watchdog detects it and retries.
The 3-Strike Rule Each stuck job is given up to 3 recovery attempts: • Attempt 1: Job reset to pending, retried at next available slot • Attempt 2: Same process — reset and retry • Attempt 3: If the job gets stuck again, the system permanently fails the prospect to prevent an infinite retry loop
The prospect status changes to 'Failed' with the message: 'Failed: stuck in processing loop after 3+ recovery cycles'
Common Causes 1) Daily mailbox limit exhausted — If your campaign has many prospects but only one mailbox with a low daily limit (e.g., 30 emails/day), the system cannot process all scheduled jobs within the limit. Jobs queue up and repeatedly miss the sending window.
Outside sending window — Jobs scheduled near the end of your sending window may not get processed in time. They expire and get rescheduled, burning recovery attempts.
Mailbox temporarily disconnected — If your mailbox has intermittent connection issues during the processing window.
Too many campaigns sharing one mailbox — Multiple campaigns competing for the same mailbox's daily capacity.
How to Prevent This • Add more mailboxes — Distribute sending across 3-5 mailboxes per campaign. This provides more daily capacity and reduces competition for send slots. • Reduce daily sending volume — If you have 500+ prospects and only 30 sends/day capacity, pace your campaign appropriately. • Use mailbox rotation — Assign multiple mailboxes with round-robin rotation so if one hits its limit, others can take over. • Check sending windows — Make sure your sending window is wide enough to process all daily sends. • Upgrade your plan — Higher plans allow more daily sends and more mailboxes.
What to Do About Failed Prospects Failed prospects are not lost — they remain in your campaign and can be re-enrolled: 1) Go to your Campaign detail page and filter prospects by 'Failed' status. 2) Review the failed prospects to confirm they have valid email addresses. 3) You can create a new campaign with the same prospects, or reset their status if the system allows. 4) Before re-enrolling, ensure you have enough mailbox capacity by adding more mailboxes or reducing other campaign volumes.
Monitoring Check your campaign's event log for 'error' events with reason 'stuck_processing_loop'. If you see many of these, it is a clear signal that your sending capacity needs to be increased for the campaign volume.
The stat box at the top of every campaign detail page (Sent, Opens, Clicks, Replies, Bounces, Open Rate, Click Rate, Reply Rate) is often misunderstood. Here is exactly what it shows.
What the Overview Stat Box Shows The overview stat box displays ALL-TIME cumulative totals for the campaign since it was created. Every email ever sent, every open ever tracked, every click ever recorded, and every reply ever received is counted — from day one of the campaign through right now.
This is NOT a daily, 12-hour, or rolling-window view. It is the complete lifetime of the campaign in a single glance.
Real-Time Updates The numbers refresh automatically every 30 seconds while you have the page open. You do not need to reload the page — opens, clicks, and replies that come in are reflected almost immediately in the stat box.
Common Misconception: 12-Hour or Daily View Some users assume the stat box only shows recent activity (for example, 'sent in the last 12 hours' or 'today's stats'). That is incorrect — it is all-time, cumulative, since campaign creation. If your campaign has been running for 3 weeks, the stat box reflects the entire 3 weeks, not just today.
When You Need a Time Window If you want time-windowed views — for example, 'how did my campaign perform over the last 7, 14, 30, or 90 days?' — use the Analytics page instead. Analytics supports date range filters and gives you day-by-day trend charts, which is the right tool for performance analysis over specific periods.
Quick Rule of Thumb • Campaign overview stat box → lifetime totals, updated every 30 seconds • Analytics page → time-windowed views and trend charts
The two views are designed to complement each other. Use the overview for a running tally of your campaign, and use Analytics when you need to slice performance by date.
Each campaign has a 'Minutes Between Sends' setting that controls the minimum interval between consecutive sends from that campaign. When the same mailbox is used by multiple campaigns (or by warmup at the same time), WarmySender enforces a per-mailbox global pacer on top of the per-campaign setting to protect your account.
How the Per-Mailbox Pacer Works The pacer is a global throttle that applies to every mailbox. It tracks the last send time from that mailbox — across all campaigns AND warmup — and blocks any new send until the minimum interval has elapsed. This prevents back-to-back sends from any combination of campaigns and warmup activity.
The Floor Is the Longest Interval If Campaign A has Minutes Between Sends = 5 and Campaign B (using the same mailbox) has Minutes Between Sends = 15, the effective floor for that mailbox is 15 minutes. The longest minimum interval among all campaigns sharing the mailbox wins. This is intentional — the system respects the most conservative setting to keep your mailbox safe.
Warmup Counts Toward the Same Pacer Warmup sends are not exempt. If warmup just sent an email from your mailbox, the next campaign send is delayed until the Minutes Between Sends interval has elapsed — and vice versa. Your mailbox will not send a warmup email and a campaign email within the same interval window. This ensures the mailbox always looks like a human is at the keyboard, not a bot blasting messages.
Why This Exists: Account Safety and Deliverability Email providers (Gmail, Outlook, Yahoo) flag bursts of rapid-fire sends as bot-like behavior. A mailbox that sends 5 emails in 30 seconds is a huge red flag — it looks like a compromised account or a spammer. The pacer makes sure every send looks natural and spaced out, protecting your sender reputation across all of your outbound activity.
What You Might Notice • A campaign may appear to send slower than its 'Minutes Between Sends' setting suggests — that means another campaign or warmup is sharing the mailbox and the longer interval is in effect. • Your effective throughput per mailbox is capped by the longest interval, not the shortest. • To increase throughput safely, add more mailboxes to the campaign rather than lowering the interval.
Best Practice • Use consistent Minutes Between Sends settings across campaigns that share mailboxes, so you know what to expect. • If you need higher volume, scale horizontally by adding mailboxes — do not lower the interval below safe thresholds. • Keep warmup running alongside campaigns — the pacer will coordinate both safely.
Short answer: leads imported from LinkedIn usually don't come with an email address, so a campaign's email steps are skipped for those contacts — there's simply no address to send to. Their LinkedIn steps still run (connection requests, messages), so the campaign isn't broken; it's doing exactly the parts it can. This is the single most common reason a campaign looks like it 'isn't sending emails'.
Why no email? A LinkedIn profile doesn't hand out a person's work email, so an imported contact arrives with a name, title, company, and LinkedIn profile — but no address yet. That's normal; it doesn't mean the import failed.
What happens in a campaign: WarmySender never invents an address or sends to a blank one (that would bounce and hurt your sender reputation). So for a contact with no email, the email steps are skipped for that one contact (everyone in the same campaign who does have an email still gets them), the LinkedIn steps still run (they only need the LinkedIn profile), and the sequence keeps moving.
How to get the email steps to send — give those contacts an email address by importing a list that already includes their emails. Because a LinkedIn profile doesn't reveal a work email, the addresses have to come from a list you already have (for example an export from your CRM, or another source you use that has their addresses). Put those contacts and their emails in a spreadsheet (CSV) with an email column, import it, and match the email column: your existing LinkedIn-imported contacts are matched to their records and gain the email, and anyone new in the file is added with theirs.
Once a contact has a valid email address, the next send cycle within your sending window picks up the email steps automatically — no rebuild, no re-enrollment. Tip: verify addresses before a big send to keep your list clean and protect your reputation ('Unknown' results are always free).
For a worked example and FAQs, see the 'Why aren't my LinkedIn-imported leads getting emails?' guide at /documentation/why-my-linkedin-imported-leads-arent-getting-emails.
If your campaign finished showing 0 emails sent, it's almost always because every contact in it was on your suppression list — the list of people your campaigns will never email. When there's no one left to send to, the campaign has nothing to do, so it wraps up right away as finished with nothing sent. This is expected behavior, not a bug.
What the suppression list is: a safety net that holds every address your campaigns should NOT email, so you never message someone who has opted out or can't receive mail. An address lands on it in three ways — they unsubscribed (anyone who clicks your unsubscribe link is added automatically, including you if you click your own link to test it), their address bounced (the mailbox doesn't exist or is closed, so it's set aside), or you marked them do-not-contact (addresses or domains you add to your blocklist yourself). Skipping these contacts is what keeps your sender reputation healthy and keeps you compliant.
Why this happens most often: you send yourself a test, click your own unsubscribe link to confirm it works (which suppresses your address), then build a new test campaign using only your own address — which is now suppressed, so the campaign finishes with 0 sent.
How to check: look for the 'some contacts were skipped' note on the campaign (if the skipped count matches your whole list, that's your answer), and open the campaign's Prospects tab where each suppressed contact shows a 'Suppressed' status.
How to test properly / fix it: use fresh contacts that aren't on your list (a second address you've never unsubscribed works well), OR if you suppressed an address by mistake, remove it under Settings → Blocklist so it's eligible again. Only remove addresses added by accident — leave genuine unsubscribes on the list, because continuing to email people who opted out harms your reputation and isn't compliant.
Reassurance: real campaigns built from fresh contacts send normally; only already-opted-out contacts are skipped. For the full guide with examples and FAQs, see 'Why did my campaign finish without sending any emails?' at /documentation/why-did-my-campaign-finish-without-sending.
How much cold email to send per day per mailbox once it's fully warmed — roughly 30–50 on Gmail, 20–40 on Outlook/Microsoft, 20–40 on Yahoo, as ranges not guarantees — and why you scale by adding mailboxes, not by pushing one harder. Keep warmup running alongside cold sending (about 20–30% of your cold volume, with a floor of ~10–15/day). Typical time to fully warmed is about 4–6 weeks. Warmup mail is clearly tagged and auto-tidied within a day, and warmup health is tracked separately from your cold results. If a domain's spam rate climbs, its warmup is slowed automatically to protect it.
Full explainer: /documentation/safe-daily-cold-email-volume-after-warmup
Why a prospect that bounced in one of your mailboxes is automatically skipped in your OTHER mailboxes in the same workspace. How bounce-fanout protects your sending domain reputation, the sender-side-safety guard that only fans out on confirmed recipient bounces, what status you'll see in the campaign view, and how to re-add a prospect after fixing the underlying issue.
Full explainer: /documentation/why-was-this-prospect-skipped-bounce
Multi-step email campaigns now keep every follow-up in the same conversation and from the same sending inbox as the first email by default, so a nudge reads like a natural reply instead of a fresh cold email. Leaving a step's subject blank reuses the original with Re:. If a sending inbox goes briefly offline, we wait for it to come back rather than switch senders mid-sequence, which would break the thread. Threading and a single, familiar sender look like a real back-and-forth to inbox providers and to the reader, which typically improves inbox placement and reply rates. You can turn it off per step by unchecking Reply in the same thread, from the same inbox.
Full explainer: /documentation/why-follow-ups-stay-in-the-same-thread-and-inbox
Email rejections come in two kinds: (A) your OWN sending provider rejects the message as spam before it ever leaves your mailbox — so it never reaches the recipient and your campaign shows sent zero; or (B) the recipient's inbox provider refuses to deliver it. This page shows how to tell them apart and the exact fix for each: a dedicated sending domain and reputable host, softer content, warmup, slower ramp, and SPF / DKIM / DMARC.
Full explainer: /documentation/why-emails-are-being-rejected
The LinkedIn add-on lets you run full LinkedIn outreach from inside WarmySender — find prospects, connect and message them across multi-step campaigns, engage with and publish content, manage every reply from a unified inbox, and rotate across several LinkedIn accounts — all paced by a built-in safety system that protects your accounts. Here's everything it can do.
OUTREACH — reach and follow up with prospects • Connection requests, with a personalized note — Send an invite with a note that uses each prospect's details, e.g. 'Hi {{first_name}}, loved your post on onboarding — would love to connect.' • Follow-up messages — Once someone connects, send a message (or a sequence of messages with waits between them), e.g. a soft intro after they accept, then a value-add a few days later. • InMail to people you're not connected to — On a Premium, Sales Navigator, or Recruiter account, message a prospect directly without connecting first. • Profile views — Warm a prospect up by viewing their profile before you reach out, so your name is already familiar. • Multi-step campaigns with smart branches and A/B testing — Build a sequence like View profile → Send invite → Wait for accept → Send message → Wait for reply, with branches that react to what happens ('if connected, do this; if they reply, stop'), and test two versions of a message to see which gets more replies.
ENGAGE & PUBLISH — build presence, not just DMs • Like and comment on posts — Engage with a prospect's or account's posts, e.g. leave a genuine comment on a lead's update before sending an invite. • Endorse skills — Endorse a connection's skill as a light, friendly touchpoint that often prompts a reply. • Publish and schedule posts, with media — Write a post, attach an image, and share it now or schedule it for later — from your personal profile or a company page you manage — e.g. line up a week of posts in advance.
FIND & MANAGE — build and organize your target list • Prospect search — Search LinkedIn directly with basic filters (keywords, title, company, location) or the advanced Sales Navigator and Recruiter filters (seniority, headcount, industry, skills, 'open to work', and more), e.g. 'VP of Sales at 51–200-person SaaS companies in Germany.' • Save & manage audiences — Save search results, import a CSV, or bring in a Sales Navigator lead list, then reuse those audiences across campaigns. • Prospect enrichment — Pull a fuller picture of a prospect (current role and tenure, top skills, education, how you're connected, follower count) onto their record before you reach out.
UNIFIED INBOX — handle every reply in one place • Reply without switching to LinkedIn — Read and answer LinkedIn conversations right here, e.g. clear your morning replies in one pass. • Voice notes and file attachments — Record a short spoken reply or send a PDF, deck, or image straight into the conversation, e.g. a 30-second voice note as a warm first reply. • Emoji reactions, edit, and delete — React to a message with an emoji, fix a typo in a message you sent, or delete one — the same quick actions you'd use inside LinkedIn. • Read receipts — See when your message was sent, delivered, and read, so you know whether a nudge would help. • Accept or decline incoming connection requests — Review invitations other people send you, read their note, and accept or decline — all from the inbox.
SAFETY & ACCOUNTS — protect what can't be replaced • Automatic warm-up and a multi-week ramp per account — Every account starts gentle and ramps up gradually, so activity always looks natural. • Safe daily and hourly limits — Sending, viewing, endorsing, and posting are each paced within safe limits per account; when you hit a day's limit, activity simply resumes the next day. • A dedicated proxy per account — Each connected account gets its own dedicated IP (choose from 40+ countries), never a shared one. • Multi-account rotation — Run a campaign across several connected accounts with round-robin, weighted, or random distribution — and each lead stays 'sticky' to the same account for a consistent experience. A banned account can't be recovered, so account safety always comes before speed.
ANALYTICS — see what's working • Cross-account analytics — Track your funnel (invites sent, accepted, replied) and per-account health across all connected accounts in one view, e.g. spot which account has the best acceptance rate. Export to CSV for your own reporting.
Getting started: make sure you're on a paid plan, add a LinkedIn seat from Billing, connect your account under LinkedIn > Accounts, build an audience with Find LinkedIn Prospects, then create your campaign under LinkedIn > Campaigns. See the other LinkedIn guides in this section for step-by-step details on each capability above.
Yes — you can run a LinkedIn campaign that only sends messages to people who are already your 1st-degree connections, with no connection requests. Here's how to set it up:
Open the campaign builder — Go to LinkedIn > Campaigns, click 'Create New Campaign', and choose 'Start from scratch'.
Basics — Name the campaign and choose the LinkedIn account (or accounts) you want to send from.
Sequence — Click 'Add Step' and choose 'Send Message', then write your message. Do NOT add a 'Send Connection Request' step — leaving it out is what keeps the campaign message-only. You can add more 'Send Message' steps with 'Wait' steps between them for follow-ups.
Prospects — Add the connections you want to message. You can paste their LinkedIn profile URLs, upload a CSV or list, or pick a saved audience. WarmySender sends to the people you add — it doesn't auto-import your whole connection list — so add the connections you want this message to reach.
Schedule & Safety — Set your sending days, hours, time zone, and daily limits, then click 'Create Campaign'.
What happens to people you're not connected to: they're skipped automatically (LinkedIn only allows direct messages to 1st-degree connections) and the campaign keeps running for everyone else. To reach non-connections, add a 'Send Connection Request' + 'Wait for Accept' before your message, or use 'Send InMail' on a Premium, Sales Navigator, or Recruiter account.
Account type: message-only campaigns work on Premium, Sales Navigator, or Recruiter accounts. On a free LinkedIn account the builder will ask you to add a connection-request step first.
Limits: messaging your connections uses your daily message allowance, which is separate from your connection-request allowance — so it never uses up your invite budget. Sending is paced by your account's gradual warm-up ramp and daily limits, because account safety always comes before speed.
Every LinkedIn message you send from the WarmySender Inbox shows a small delivery status underneath it, so you always know whether your outreach landed and whether it's been read. You don't turn anything on — the status appears automatically on each message you send.
The three statuses: - Sent (single check) — Your message has left WarmySender and is on its way to the person on LinkedIn. This is the first status every message gets the instant you send. - Delivered (double check) — LinkedIn has confirmed the message reached the person's inbox. It's sitting in their conversation, waiting to be opened. - Seen (with a time, e.g. 'Seen 2:14 PM') — The person opened the conversation and read your message.
Where to see it: Open your Inbox, choose a LinkedIn conversation, and look just below each message you sent. The status is in small muted text under your message bubble (it only appears on messages you sent, not ones the other person sent). Campaign messages appear in the same conversation view and carry the same Sent → Delivered → Seen status.
Delivered vs Seen: 'Delivered' means the message reached their inbox; 'Seen' means they actually opened and read it. A message that's 'Delivered' but not 'Seen' for a while means a gentle nudge later might help; a 'Seen' with no reply means they've read it and are choosing not to respond yet.
Why a message might never show 'Seen': usually the person just hasn't opened the conversation yet — completely normal. It can also happen if the recipient has read receipts turned off on their own LinkedIn account, in which case LinkedIn doesn't report a read back to anyone.
Stuck on a single check ('Sent') and not moving to 'Delivered'? The connected LinkedIn account usually needs a quick reconnect — open LinkedIn > Accounts and follow any reconnect prompt; delivery confirmations catch up automatically once the account is healthy.
Full guide: /documentation/see-when-your-linkedin-messages-are-delivered-and-read
The reply box in your WarmySender Inbox can do more than text. From it you can attach a file, record a short voice note, and quote a specific earlier message — everything sends straight to the LinkedIn conversation, so your replies are as rich as they'd be inside LinkedIn itself.
Three extra controls: - Attachments (the paperclip) — Send a file straight into the conversation: a PDF one-pager, a case study, an image, a slide deck, a spreadsheet. The person receives it in their LinkedIn inbox exactly as if you'd attached it on LinkedIn. - Voice notes (the microphone) — Record a short spoken message right in the reply box. A quick voice note often lands warmer than text for a first reply or a thank-you. - Quoted replies (the reply arrow) — Reply to one specific earlier message so it's clear which point you're answering, useful in a long back-and-forth.
How to send a file: Open the conversation, click the paperclip, choose the file, optionally type a message, and Send. You'll see the file attached before you send, and it arrives in the LinkedIn conversation. Tip: a one-page PDF or short deck gets opened more than a long document.
How to record a voice note: Click the microphone, allow your browser to use your microphone the first time, speak your message (20-40 seconds usually lands best), stop, listen back, re-record if needed, then Send. If the microphone doesn't respond, check your browser's site settings for warmysender.com and make sure the microphone is allowed, then reload.
How to reply to a specific message: Hover over the message you want to answer and click the reply arrow — it's quoted above your reply box so the person sees exactly what you're responding to.
For campaign steps: this reply box is for live, per-person replies once someone responds. To attach a file to an automated campaign message that goes to everyone on a step, see 'Attach files to your LinkedIn campaign messages'. Account safety always comes first.
Full guide: /documentation/send-attachments-and-voice-notes-in-linkedin-messages
You can attach a file to a Send message step in your LinkedIn campaign — a PDF one-pager, a case study, an image, a slide deck, or a short voice note. You upload it once when you build the step, and from then on that file goes out with that message to every prospect the step reaches, automatically. No re-uploading per person, no pasting links into the text.
What it does: - Saved once, sent to everyone the step reaches — the file is stored with the step, so it's automatically included every time that message is sent. - Tied to one step, not the whole campaign — attach a one-pager to your first message and leave the follow-up as plain text, or attach a different file to each. - Works with your message text and personalization variables like {{first_name}} and {{company}} — every prospect gets a message addressed to them plus the same attached file.
How to attach a file: Open your LinkedIn campaign and go to the sequence builder. Click the Send message step you want (or add one under Actions > Send Message). Write your message (use the Insert Variable button for personalization). Click the paperclip icon on the step, pick the file, wait for the file name to appear, then Save the step and your campaign. The file is now sent with that message to everyone the step reaches. To change it later, edit the same step, remove the current file, and add a new one — it applies to prospects who reach the step from that point on.
Voice notes: a step can also carry a short voice note (20-40 seconds usually lands best). Because it goes to everyone on the step, keep it a general, friendly opener. For a truly personal spoken reply to one individual, record it live in the Inbox once they've responded.
File types and size: PDFs, images (PNG, JPG), slide decks, and documents, plus a short voice note. Keep files under 20 MB so they open quickly. If a file won't attach, it's almost always too large — export a smaller version or share a link in your message instead.
Best practices: keep it relevant and light (a one-pager is the hook, not the whole pitch); one well-chosen file per step (put a second file on a later follow-up step if you have more to share); let personalization variables do the talking while the file stays the shared resource; give the file a clear name and a first page that makes sense on its own. Save per-person files and personal voice notes for the Inbox once someone replies.
Is it safe? Yes — attaching a file doesn't change your sending pace or daily limits. The file simply rides along with a message that was already going out, and if a file can't be included on a send, your text still goes out so outreach isn't held up.
Full guide: /documentation/attach-files-to-your-linkedin-campaign-messages
Hover over any message in a LinkedIn conversation in your WarmySender Inbox and a small row of controls appears: react with an emoji, edit a message you sent, or delete it — the same quick actions you'd reach for inside LinkedIn's own messenger, right where you manage your campaigns.
The three controls: - React (the smiley icon) — Add an emoji reaction to any message in the conversation (yours or theirs). A quick, low-effort way to acknowledge a reply or say thanks without typing a full message and firing another notification. - Edit (the pencil icon) — Change the text of a message you already sent, perfect for fixing a typo, a wrong name, or an autocorrect slip. - Delete (the trash icon) — Remove a message you sent from the conversation, on both sides. Delete is permanent and can't be undone, so it asks you to confirm first.
How to react: Hover over the message, click the smiley icon, pick an emoji — the reaction shows immediately on both sides, with no extra send step.
How to edit: Hover over your own message, click the pencil, change the text, and save — the corrected version replaces the original for both people.
How to delete: Hover over your own message, click the trash icon, confirm, and it's removed for both people.
How long you have: You can edit or delete a message you sent only for a short window right after sending — this is LinkedIn's own limit, roughly an hour, not something WarmySender sets or can extend. Inside that window the pencil and trash icons appear when you hover; once it passes, they no longer show, because LinkedIn no longer permits the change. The reaction (smiley) icon still works on older messages — only editing and deleting are time-limited. After the window closes, a short follow-up message with the correction is the cleanest fix.
Editing or deleting one already-sent message changes only that message — it doesn't alter your campaign's saved steps or what future prospects receive.
Full guide: /documentation/react-to-edit-and-delete-linkedin-messages
Two small controls in your WarmySender Inbox keep a busy conversation list under control. They work on LinkedIn and email threads alike, and neither changes anything for the person on the other end — they're purely about managing your own attention.
Mute a conversation: Quiets a thread that's pinging you more than it's worth — a chatty group thread, an auto-responder that keeps replying, or a conversation that's wrapped up. The conversation stays in your Inbox and you can still open it any time; it just stops nudging you. To mute: open the conversation's actions and choose Mute. To reverse it, choose Unmute. Muting is completely private — the other person isn't notified and still receives your messages / can still message you; new messages in a muted thread still arrive and are saved.
Mark as unread: Flags a conversation you've already read so it shows as unread again — your 'deal with this later' marker. It's the classic trick for a reply that needs a proper response you don't have time for right now. To mark unread: open the conversation's actions and choose Mark as unread. It returns to read when you next open it. Pair it with the unread (or 'needs reply') filter to see everything you've flagged as one tidy to-do list.
Mute vs archive: Muting keeps a conversation in your Inbox but quiets it; archiving files it away out of your main view entirely. Mute is 'turn the volume down'; archive is 'put it away'. Both are reversible and neither deletes any messages.
Does muting stop my campaign? No. Mute and mark-unread only affect how a thread looks and behaves for you in the Inbox — they never pause or change a campaign. Separately, a prospect's reply already stops their remaining automated follow-ups by default (Stop-on-Reply), so you don't need to mute a thread to halt a sequence.
Full guide: /documentation/mute-conversations-and-mark-them-unread
When someone sends YOU a LinkedIn connection request, it now shows up in your WarmySender Inbox alongside your conversations — with the sender's name, their note if they added one, and Accept and Decline buttons right there. So you can triage who's asking to connect, read why, and decide, all without opening LinkedIn.
Important distinction: these are the invitations OTHER people send to you — a completely separate thing from the invitations your campaigns send OUT to prospects. This is only about requests you receive; to see whether your outbound invites have been accepted, check your campaign's Prospects view instead.
Where to see them: Open your Inbox and look on the LinkedIn side — incoming requests appear there among your conversations. If you have more than one LinkedIn account connected, requests are shown per account.
How to accept or decline: Find the request, read the sender's name, headline, and note (if any) so you can decide with context, then click Accept to connect or Decline to turn it down. The outcome flows straight through to LinkedIn — no separate step there. Declining is quiet: the sender isn't sent a 'you were declined' message.
What happens after you accept: They become a 1st-degree connection on LinkedIn and you can message them normally. Accepting doesn't automatically add them to any campaign — connecting and messaging are separate, deliberate steps. If you want to follow up with people who've connected, add them yourself to a message-only LinkedIn campaign that reaches existing connections (no new invitations).
Is it safe to accept a lot at once? Reviewing genuine invitations one at a time in the Inbox is the careful, human way to do it — WarmySender keeps you in control and doesn't auto-accept for you. If you get an unusual flood, it's fine to work through them in batches over time; account safety always comes first, including on the receiving side.
Full guide: /documentation/accept-or-decline-connection-requests-from-your-inbox
Open any prospect in Prospects and click 'Enrich from LinkedIn' to pull a fuller picture of who they are — their current role and how long they've been in it, their top skills, education, how you're connected, and their follower count — right onto their detail view. It's on-demand and one prospect at a time, so you enrich the people you're about to reach out to.
Important to know: enriching someone pulls their LinkedIn profile, which is the same as VIEWING their profile — so it can appear in their 'who viewed your profile', and it counts toward your account's safe daily number of profile views. This isn't a downside to avoid; it's simply how LinkedIn works, and worth knowing so the count doesn't surprise you.
Where: Go to Prospects, open the prospect, and use the 'Enrich from LinkedIn' button on their detail view. The enriched fields appear once they load. The prospect needs a LinkedIn profile link on their record and you need a connected LinkedIn account.
Why is the Enrich button greyed out? Because you've reached your account's safe daily number of profile views for now. The button turns off for the rest of the day and shows 'Daily LinkedIn limit reached — try tomorrow', then comes back on automatically the next day. It's a protection: viewing too many profiles too fast is a pattern that can get accounts flagged, so WarmySender stops you at the safe number.
Why one at a time? Each enrich is a real profile view, so WarmySender never enriches your whole list in the background — that would quietly spend your daily budget and put your account at risk. You choose who to enrich and when; the platform keeps you inside safe limits. Account safety always comes first.
Full guide: /documentation/enrich-a-linkedin-prospect
Write a LinkedIn post in WarmySender and either share it right away or schedule it for later — and choose whether it goes out from your personal profile or from a company page you manage. Line up a week of posts in advance, keep drafts, and watch likes, comments, and views roll in once each one is live.
Where: Open LinkedIn > Posts and use the composer. Write your post, add an image if you like, choose who it's from (your profile or a company page you manage), then publish now or pick a date and time to schedule it. Everything you've drafted or scheduled shows in one list.
Post to a company page: In the composer, use the 'post as' picker and choose your company page instead of your name. It's a per-post choice. Only pages your connected account is an admin of appear as options, because LinkedIn only lets page admins post on a page's behalf. If a page is missing, make sure your account has admin access to it on LinkedIn.
Schedule for later: Write the post, choose the sender, pick a date and time, and save it as scheduled — it goes out automatically at that time, and you can edit or cancel it any time before then.
Is there a limit? Yes — posting is kept to a safe daily number per account and paced out so your activity stays natural (you'll see a calm 'paced to stay within safe limits' note). If you schedule more than the day's safe number, the extra posts flow to the next available time rather than all going out at once. A sudden flurry of posts is a pattern that can get an account flagged, so this pacing protects your reach and your account. Account safety always comes first.
See performance: Once published, a post's likes, comments, shares, and views appear on it in your Posts list, and you can open any post on LinkedIn directly.
Full guide: /documentation/publish-or-schedule-linkedin-posts
If you're hiring, you can post a role to LinkedIn straight from WarmySender, then watch applicants come in and move them through simple stages — from brand-new applicant, to reviewed, to contacted, to hired (or politely declined). Open a candidate to read their headline and download their resume, all next to the outreach you already run here.
Where: Open LinkedIn > Jobs. Create and publish a job posting; every published role lists the applicants it received. Open a role to see its candidates; open a candidate to review them and set their stage. Posting jobs needs a LinkedIn account that can post roles (a hiring-enabled account).
Post a job: Start a new job, write the title and description, then save it as a draft or publish it to make it live on LinkedIn. As people apply, open the role to see the applicant list.
Review applicants: Open a published role to see everyone who applied, then open a candidate to read their headline and download their resume when they've attached one. Set each candidate's stage — new, reviewed, contacted, rejected, or hired — so your pipeline reflects where everyone stands.
Is it safe? WarmySender keeps job posting to a small, safe daily number per account, because publishing many roles quickly is an unusual pattern that can draw attention to an account. Reviewing applicants and downloading resumes isn't limited — only the publishing of new roles is paced. Account safety always comes first.
Full guide: /documentation/post-job-openings-and-review-applicants
Two handy things you can do to a connected LinkedIn account right from the LinkedIn > Accounts page: see how many InMail credits the account has left, and edit your own LinkedIn profile — your headline, your About section, and the Open to Work toggle — without switching over to LinkedIn.
Check InMail credits: Open LinkedIn > Accounts and look at the account — its remaining InMail credits are shown right there. That tells you how many out-of-network messages (messages to people you're not connected to) you can still send this cycle. The allowance comes from LinkedIn based on the account's plan; WarmySender just shows what's left. If the balance looks low, recent InMails have used some up — LinkedIn tops it back up on its own schedule.
Edit your profile: On LinkedIn > Accounts, open the profile-edit option for the account and update your headline, your About section, or the Open to Work toggle, then save — the change is applied to your LinkedIn profile. A clear headline and up-to-date About section are what a prospect sees when they check who's reaching out, so keeping them sharp helps your outreach convert.
Is editing safe? Yes — occasional profile edits are completely normal, and WarmySender keeps them to a small safe daily number per account so the activity always looks natural. If you hit the day's limit, WarmySender tells you and it refreshes the next day — you're gently paced, not blocked. Changing a profile many times in quick succession is an unusual pattern that can draw attention to an account, so pacing protects it. Account safety always comes first.
Full guide: /documentation/check-inmail-credits-and-edit-your-linkedin-profile
Detailed guide for connecting your LinkedIn account:
Prerequisites:
Active paid subscription (any paid plan)
Active LinkedIn seat ($15/month from Billing page)
LinkedIn account in good standing (no current restrictions)
Connection Steps:
Go to LinkedIn > Accounts and click 'Connect Account'
Choose your connection method — credentials, cookie-based, or OAuth
Enter your LinkedIn login details
If 2FA is enabled: you'll be prompted for a verification code. Enter it within 10 minutes.
Wait for the connection to complete — your account will show 'Connected' status
Account Types Detected:
Free — Standard LinkedIn (150 invites/week cap)
Premium — LinkedIn Premium (200 invites/week cap)
Sales Navigator — Extended search and InMail access
Recruiter — Recruiter-specific features and limits
Strategy Assignment: The system assigns a safety strategy based on your account history: • New Account — 6-week ramp-up, most conservative limits • Established — 4-week ramp-up, moderate limits • Veteran — 2-week ramp-up, higher limits • Recovery — 8-week ramp-up, applied after account restrictions
Proxy Support: Each account gets a dedicated fixed IP — your traffic never routes through a shared server. Configure during Step 2 of connection: • Auto — System-assigned proxy geo-located near your real IP (default, recommended) • Country — Select a specific country from 40+ available locations • Custom — Provide your own proxy URL (HTTP, HTTPS, or SOCKS5 with optional auth) For full details, supported countries, and custom proxy format, see the 'LinkedIn Proxy & IP Security' guide in this section.
Reconnection: If your LinkedIn session expires, the account status changes to 'Needs Verification'. All active campaigns are auto-paused. After reconnecting, campaigns automatically resume.
Your LinkedIn session lapsed and WarmySender paused sending until you reconnect. We send up to three friendly reminder emails — right away, then 24 hours later, then 72 hours later — so the request does not get buried in your inbox. Reconnecting takes about 30 seconds and your campaign data, prospects, and acceptances are preserved.
When this happens: LinkedIn occasionally asks you to sign in again, even on a healthy account in good standing. The most common reasons: • Routine session rotation — LinkedIn rotates session tokens roughly every 30 days regardless of account standing. Even premium and Sales Navigator accounts hit this. • A security challenge — if LinkedIn asks you to verify a sign-in from a new location or device, the existing connection on WarmySender's side also needs a fresh login. • An IP or network change — switching networks (home to office, on or off a VPN, between countries) can expire the session. • A change to your LinkedIn password or 2FA — LinkedIn revokes every active session, so a fresh sign-in is required. (This is about your LinkedIn password; WarmySender itself has no password — you sign in with a 6-digit code we email you.) • A long idle period — sessions sometimes lapse simply because the connection has been quiet.
The reminder schedule:
Reminder 1 — sent as soon as we detect the lapse, with the affected LinkedIn account named in the subject line.
Reminder 2 — about 24 hours later if you have not reconnected.
Reminder 3 — about 72 hours later if you still have not reconnected.
After 7 days — the affected campaigns move to a paused state to protect the account, but nothing is lost.
Reconnect on the first reminder, the second, the third, or weeks later — the sequence stops the moment your account is healthy again.
How to reconnect (the 30-second fix):
Click the Reconnect button inside any of the reminder emails, or open WarmySender and go to the LinkedIn accounts page.
Sign in to LinkedIn through the hosted re-authentication page — enter your LinkedIn email, password, and your 2FA code if enabled. Your password never touches WarmySender; the secure handshake is between you and LinkedIn directly.
The account flips back to connected within seconds. Campaigns resume on their normal schedule.
Your campaign data is preserved:
Every prospect stays enrolled at the exact step they were on.
Acceptances flow back normally — even ones that arrived during the lapse.
Your invitations on LinkedIn are unaffected; they remain in your prospects' invitation queue.
Your other connected LinkedIn accounts are unaffected.
Cold email campaigns continue running normally.
Daily caps and ramp progress are preserved with no reset on reconnect.
Why three emails instead of one: One email is easy to miss during a busy stretch. Three escalating reminders give you a real chance to catch it before your outreach slows down meaningfully. If you reconnect on the first reminder, you never see the second or third.
How to stop getting these emails: Reconnect. The reminders stop automatically the moment your account is healthy again. If you have intentionally retired a specific LinkedIn account, email [email protected] from your registered address and ask us to mark that account as intentionally disconnected — that turns off reminders for that one account.
Account safety reasoning: Pausing sending the moment we detect a lapse is the safest thing we can do. The alternative — retrying failed sends in the hope that the session comes back — would create a pattern of failed actions on LinkedIn's side, which is exactly the kind of behavior automation-detection systems look for. So we pause cleanly, send the reminder emails, and wait for you to reconnect with a real sign-in.
See /documentation/why-am-i-getting-reconnect-emails-from-warmysender for the full guide with the complete FAQ. Related: /documentation/linkedin-disconnect-and-reconnect (deep dive on session rotation), /documentation/why-is-my-linkedin-account-disconnected (status pill semantics).
Manage all LinkedIn conversations from LinkedIn > Conversations:
Conversation List:
View all LinkedIn message threads from your connected accounts
Filter by: All / Unread / Replied, and by specific LinkedIn account
Search conversations by text
Campaign tracking badges show which conversations came from campaigns
Conversations auto-refresh every 30 seconds
Message Thread:
View the full conversation history with timestamps and delivery status (sent, delivered, read)
See prospect profile info alongside the conversation
Replying:
Reply directly from WarmySender without switching to LinkedIn
Use quick-insert templates for common responses
Message limit: 8,000 characters
Select which LinkedIn account to send from (if you have multiple)
Campaign Integration:
When a prospect replies to your LinkedIn campaign message, they are marked as 'replied' and removed from further automated follow-ups in that campaign
The conversation thread shows which campaign step triggered the initial message
The Unified Inbox also has a LinkedIn tab showing all LinkedIn conversations alongside your email replies for a complete view of all prospect interactions.
Ramp-Up Period: Limits start low and increase over 4 weeks. Actual daily limits ramp gradually per account type — for example, a Free account ramps from ~15 invites/day in week 1 to ~40/day at full ramp. The system calculates your exact daily limits based on your account age.
Strategy-Based Limits (additional layer):
New Account (6 weeks): max 150 invites/week, 75 messages/day
Established (4 weeks): max 175 invites/week, 85 messages/day
Veteran (2 weeks): max 200 invites/week, 100 messages/day
Recovery (8 weeks): max 100 invites/week, 50 messages/day
The system takes the MINIMUM of account-type and strategy limits
Safety Mechanisms:
If API calls fail repeatedly, LinkedIn operations are automatically paused to prevent account restrictions
Errors trigger increasing delays between retry attempts
The system monitors for LinkedIn restriction signals and pauses proactively
Account Restriction Handling:
If LinkedIn restricts your account, all campaigns are auto-paused immediately
After 2+ restrictions, the system switches to Recovery strategy (most conservative)
Campaigns do NOT auto-resume after restrictions — you must manually verify and resume
If you run more than one LinkedIn campaign from the same connected LinkedIn account, they share a single daily allowance. They do not each get their own.
The allowance belongs to your LinkedIn account, not to your campaign LinkedIn sets its limits per person — per account. It has no concept of your campaigns. So when you point three campaigns at one connected LinkedIn account, all three draw from the same daily pool of connection invitations, messages and profile views. The 'Daily limit' you set on a campaign is a ceiling, not a reservation: setting three campaigns to 50 invitations a day each does not produce 150 invitations a day. The lowest limit always wins, and it is always the account's.
How WarmySender divides it Every running campaign on the account is guaranteed an equal share of that account's daily allowance. If the account can send about 30 invitations today and three campaigns are running from it, each is guaranteed 10. No campaign can take the whole day and leave the others with nothing — which is exactly what used to happen when two busy campaigns started earlier in the day than a third.
Why a campaign can say 'running' while nothing goes out Because it has used its share for today and is waiting for tomorrow's. That is not a fault and nothing is broken or lost — every enrolled person stays exactly where they are in the sequence. Open the campaign and look at the 'Daily allowance' row: it shows this campaign's own share, how much of it has been used today, which campaigns it is sharing the account with, and when it picks up again.
What it means for how long a campaign takes Sharing an allowance divides capacity — it does not create any. If a campaign's share works out to around 9 actions a day and it still has 1,000 people to reach, that is a months-long run, and no setting inside the campaign can shorten it. Raising the campaign's own daily limit changes nothing, because the account's limit is the one that binds.
How to actually send more Connect another LinkedIn account and move one of the campaigns onto it. That adds a second real allowance rather than slicing the first one thinner. Two other options that cost nothing: pause the campaigns you care least about right now, so the ones that matter get a bigger share of the same account, or let a smaller list finish first before starting the next campaign.
Why we don't just send more A banned LinkedIn account is unrecoverable, so account safety always wins over speed. Sending past the account's daily allowance — or bursting to catch up after a quiet spell — is exactly the pattern LinkedIn's automated systems look for. Pacing your outreach inside the safe allowance is what keeps the account, and everything you've built with it, alive.
Full guide: /documentation/how-campaigns-share-one-linkedin-accounts-daily-limit. Related: /documentation/linkedin-slow-sending and /documentation/linkedin-safety.
If your LinkedIn campaign appears to send fewer invites or messages than you expected — or seems to stop sending after a few — there is almost always a safe and intentional reason. WarmySender's #1 priority on LinkedIn is your account's survival. A banned LinkedIn account is unrecoverable, so the platform errs heavily on the side of caution.
Reason 1: LinkedIn's per-account limits (the hardest constraint) LinkedIn enforces strict per-account limits regardless of which automation tool you use. WarmySender respects these limits because exceeding them is the fastest way to get an account restricted or banned.
Free LinkedIn account: ~150 invites per week (no note attached). Some free accounts that send invite notes have been observed at as low as ~5 invites per month before LinkedIn temporarily blocks further invites. Free accounts hit weekly caps fastest — if you are running an aggressive invite campaign on a free account, expect a low ceiling.
LinkedIn Premium: ~80-100 invites per day (~200/week typical).
LinkedIn Sales Navigator: ~80-100 invites per day (~200/week typical).
LinkedIn Recruiter: ~200/week typical, plus separate InMail credit pool.
These are LinkedIn's safety thresholds, not WarmySender's. If your account hits the weekly cap on Tuesday, no third-party tool can make LinkedIn accept more invites until the cap rolls over. WarmySender will detect this, mark the prospect for retry 4-8 hours later, and try again. The prospect is never silently dropped.
Reason 2: The 4-6 week safety ramp on every new account A new LinkedIn account connected to WarmySender does NOT immediately send at full speed. Every new account starts in a conservative ramp window:
Week 1: ~10-15 invites/day (around 70-105/week)
Week 2: ~20 invites/day
Week 3: ~30 invites/day
Week 4+: full ramp (subject to your account-type cap above)
This ramp matches LinkedIn's safe expectations for a new automation pattern. Older accounts with established history (used WarmySender for 1+ months without restriction) move faster. Accounts that have ever been restricted move slower (Recovery strategy: 8-week ramp at half speed).
Reason 3: We honor 'try again later' responses correctly When LinkedIn responds 'cannot resend yet — temporary provider limit' to an invite attempt, that is LinkedIn telling us to back off for a few hours. Our system's response: reschedule that prospect's invite for 4 to 8 hours later (with a small random offset to avoid bursting), and DO NOT advance the prospect past the invite step. The next scheduler tick will retry. Because of this behavior, you may see a campaign sit at a low daily count for a day or two, then rebound the next day once the per-account window has rolled over.
Reason 4: Your campaign's own schedule Each campaign has active days (which days of the week sending is allowed) and a sending window (which hours, in your campaign's timezone). Common patterns: weekdays only, Mon/Tue/Wed only, Tue-Thu. If today isn't a scheduled day, your campaign correctly sits idle. If you set Mon/Tue/Wed and it is now Thursday, you will see 0 sends — that's by your configuration. Edit schedule from campaign settings.
Reason 5: We never bulk-replay missed sends after an outage If a fix or reconnect happens after a quiet period, WarmySender does NOT 'catch up' by sending a burst of held-back invites. Bursting after a gap is exactly the pattern LinkedIn uses to detect automation. Throughput catches up naturally over the next 1-2 weeks of normal scheduling.
What to check first if you think your campaign is too slow:
1. Go to LinkedIn → Accounts and check your account type pill (Free / Premium / Sales Navigator / Recruiter). Free accounts have the lowest cap. 2. Check 'connected for X weeks' — if under 4 weeks, you are still in the safety ramp. 3. Open the campaign's analytics and look for skipped enrollments labeled 'rate limited' or 'cannot resend yet' — those are LinkedIn-side caps, not bugs. 4. Check your active days and sending window — make sure today, and right now, fall inside them. 5. Check whether your account is shared across multiple campaigns. One account = one daily/weekly cap, split across all campaigns it powers. If you have 4 campaigns on one account, they are competing for the same 50 message-equivalent slots/day.
When to contact us: If your account is connected for more than 4 weeks, you are within schedule, you have weekly cap remaining, and you still see no sends for >24 hours, email [email protected] with the campaign name and your timezone. We will dig into the specific row.
For the full set of LinkedIn limits we enforce against — invite caps, message caps, InMail caps, and the gradual ramp — see /documentation/linkedin-account-safety-limits.
From time to time we ship platform-level updates that improve sync speed, delivery reliability, and account-state guarantees. After certain rollouts, LinkedIn accounts connected to WarmySender need a quick re-authentication so the new platform components can pick up the session. If you see an amber 'Reconnect needed' banner at the top of LinkedIn → Accounts, this guide is for you.
Why reconnects sometimes happen after a platform update WarmySender connects to LinkedIn through our LinkedIn provider, an authentication and orchestration partner. When we upgrade core components — for example, our queue runtime, our LinkedIn worker pool, or the way we register accounts on our LinkedIn provider's side — accounts that were connected on the old infrastructure can become 'orphaned' relative to the new layer. Their actual LinkedIn session is fine; what's stale is the link between WarmySender and our LinkedIn provider for that specific account. The fastest, safest fix is for you to re-trigger the auth handshake so a fresh, clean record is created on the new infrastructure. This is intentional — silently rebinding accounts in the background is exactly the pattern LinkedIn flags as suspicious. A brief, user-initiated reconnect keeps your account in great standing. We will only ever send you a reconnect email when the change is rolling out platform-wide; ad-hoc disconnects (LinkedIn-side session expiry, password change, 2FA reset) are covered in our separate 'Why does my LinkedIn account show as disconnected?' guide.
Who needs to reconnect Anyone whose LinkedIn account on the LinkedIn → Accounts page shows the amber 'Reconnect needed' alert. If the page is fully green for every account, no action is needed on your end. If even one account is amber, click Reconnect on that row to clear it. Multi-account workspaces should reconnect each affected account individually — it takes about 30 seconds per account.
How to reconnect (4 steps, ~30 seconds) 1) Open WarmySender and go to LinkedIn → Accounts in the sidebar. Affected accounts show an amber 'Reconnect needed' alert with a primary 'Reconnect Account' button. (Screenshot: an amber banner at the top of the page reading 'Reconnect needed — N LinkedIn account(s) require re-authentication' followed by per-row alerts on each affected account.) 2) Click 'Reconnect Account' on the row. You'll be routed to a hosted re-authentication page. No credentials are shared with WarmySender directly — our LinkedIn provider handles the auth securely via LinkedIn's official OAuth-style handshake. 3) Confirm your LinkedIn login. If 2FA is enabled, enter the code. If LinkedIn shows a security challenge or CAPTCHA, complete it as you would any other LinkedIn login. The whole thing should take ~15-20 seconds. 4) Return to WarmySender. The status pill flips from amber 'disconnected' to green 'connected' within seconds. The aggregate banner at the top of the page disappears once every affected account is reconnected. (Screenshot: green 'Connected' status pill alongside the account row, and the amber top-of-page banner gone.)
What happens to my campaigns during reconnection The moment a LinkedIn account becomes disconnected, every campaign attached to it is auto-paused with reason 'account_disconnected' or 'linkedin_account_disconnected'. Each affected campaign shows a small hint on the campaign card and detail page: 'Will auto-resume after LinkedIn account reconnection.' Prospects keep their exact place in the sequence — nothing is dropped, nothing is reset, no step is skipped. As soon as you complete the reconnect, the platform's failure-rate window resets for that account and the next scheduler tick (within ~5 minutes) automatically resumes the paused campaigns. You do not need to manually click Resume on each one. Account safety always wins: even on resume, sends respect your daily / weekly LinkedIn caps, your sending window, and your active days — there is no burst catch-up of held-back invites.
If a campaign was paused for any OTHER reason at the same time (manual pause, high failure rate from before the disconnect, or a different downstream issue), it may still need a manual Resume from its settings page after reconnection. If you click Resume and it immediately re-pauses, contact support — that signals a stale failure window that needs manual reset.
FAQ Q: Will I lose my prospects or audiences? A: No. Reconnecting only refreshes the link between WarmySender and your LinkedIn session. Your prospects, audiences, conversations, campaign sequences, and historical metrics are all stored on our side and are untouched by the reconnect.
Q: Will my campaigns restart from the beginning? A: No. Campaigns resume from the exact step each prospect was on at the time of the disconnect, including any 'wait for acceptance' or 'wait N days' delays that were in flight. There is no reset and no re-enrollment.
Q: What if reconnect fails or the status doesn't update? A: Wait 30-60 seconds for our LinkedIn provider's webhook to land, then click 'Sync Status' from the account's three-dot menu. If the status still shows disconnected after a manual sync, the auth flow may not have completed — close any in-progress reconnect tab and try the reconnect button again from a fresh browser tab. If it still fails after a second attempt, email [email protected] with your account email and we'll look at the specific row.
Q: How often do I need to reconnect? A: Rarely. Platform-update reconnects are infrequent — usually only after meaningful infrastructure rollouts. Ad-hoc reconnects are also rare and are typically driven by LinkedIn (password change, 2FA reset, idle session, IP region change). Accounts in good standing on Premium / Sales Navigator can go months without ever needing a reconnect.
Q: Is my LinkedIn account safe? Will this trigger a flag? A: Yes, your account is safe. The reconnect uses LinkedIn's official authentication flow via our LinkedIn provider — the same secure handshake any approved tool uses. We never store your LinkedIn password, never bypass 2FA, and never reuse stale tokens. Reconnect after a platform update is a routine, low-stakes action that LinkedIn treats exactly like any other login from your normal IP/device.
WarmySender's LinkedIn add-on is billed at $15 per seat per month (or $120 per seat per year — 33% off — if your subscription is yearly). Each seat allows one connected LinkedIn account.
Pricing & grandfathering: seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price. New orders and newly added seats are billed at $15/seat/month and $120/seat/year (33% off). If you're an existing customer on an older rate and add a seat, your older seats stay at their original rate and the new seat is billed at the current $15 — this means a single invoice can show a mix of rates, which is intended.
This guide explains exactly what happens when you add a seat, what happens when you remove a seat, and why the model is designed the way it is. The key idea: seats follow the same rule as the parent subscription — you pay for the period, you keep what you paid for, and reductions take effect at the next billing date.
Adding seats — your card is charged immediately
When you click 'Add Seat' on the Billing page, the new seat is available right away (you can connect a LinkedIn account to it within seconds), and your card on file is charged immediately for the prorated cost of that seat through the end of the current billing period. The charge is calculated by Stripe and reflects only the days remaining in your current cycle.
Worked example — adding seats mid-period
Let's say your billing cycle runs from April 1 through May 1 ($15/seat/month, monthly billing). On April 15 you click 'Add Seat' to bring your seat count from 2 to 5 (adding 3 seats). The math:
Days remaining in cycle: April 15 → May 1 = 16 days out of 30
Prorated cost per seat: $20 × (16/30) = $10.67
Total prorated charge for 3 seats: 3 × $10.67 = $32.00
Charged immediately to your card on file: $32.00
On May 1 (next renewal), your card is charged the full month for all 5 seats: 5 × $20 = $100.00
The immediate charge appears on your card statement within minutes and shows up as a separate invoice in Billing → Invoices. If your card is declined or has insufficient funds, the seat increase is refused — your seat count stays at 2 and no partial charge is held. You can update your card and try again. Annual subscriptions follow the same proration logic, just over a longer period.
Removing seats — reduction is scheduled for the period end (no refund)
When you click 'Reduce Seats' or 'Remove Seat' on the Billing page, the reduction does NOT take effect immediately. Instead, the platform schedules it for the end of your current billing period. Until then, the seats remain billable AND remain fully usable — any LinkedIn account currently connected to one of those seats keeps running its campaigns normally for the rest of the period. No card charge, no refund, no proration on the reduction.
Worked example — reducing seats mid-period
Using the same April 1 to May 1 billing cycle: on April 25 you decide to reduce from 5 seats back to 3 seats. What happens:
You click 'Reduce to 3 seats' on the Billing page.
Confirmation dialog: 'Reduces from 5 seats to 3 seats on May 1, 2026 (next billing date). You can cancel this scheduled reduction anytime before May 1.'
The Billing page now shows: 'Current: 5 seats — Reduces to 3 on May 1 — [Cancel scheduled reduction]'
Between April 25 and May 1, all 5 seats remain fully active. Any LinkedIn account already connected to one of the seats being removed keeps running its campaigns for the rest of the period.
On May 1 (period rollover), the reduction applies automatically. Your seat count drops from 5 to 3, and your renewal invoice is charged for 3 × $20 = $60.00 (instead of 5 × $20 = $100.00).
No refund is issued for the 5-seat period that just ended. You used the seats, you paid for the period — same as the parent subscription.
Why no refund? The same reason canceling a subscription mid-month does not refund the partial month: you had access for the full period, and access is what we charged for. This also keeps the model fair across all customers — without the schedule-at-period-end rule, a user could add 5 seats, run them aggressively for a week, then drop back to 1 seat and pay close to nothing for the extra 4 seats. That would not be fair to customers who legitimately budget seats for the full month.
Canceling a scheduled reduction
If you change your mind before the period rolls over, click 'Cancel scheduled reduction' on the Billing page (visible while a reduction is pending). The pending reduction is cleared immediately, the next renewal will bill the full original seat count, and there is no penalty or fee. You can reduce again later from the same page if you change your mind back.
What if I have connected accounts on the seats being reduced?
WarmySender does NOT auto-disconnect any LinkedIn account on a scheduled reduction. The seats stay billable and fully active until the period rollover, including any campaigns running on them. If, at the moment the period rolls over, you have more connected accounts than the post-reduction seat count (e.g., you scheduled 5 → 3 but reconnected an additional account in the meantime, ending up at 5 connected accounts again), the reduction is REFUSED at apply time and stays scheduled for the next cycle. We never auto-delete a connected LinkedIn account in a billing path — the customer must voluntarily disconnect or cancel the scheduled reduction. Account safety always wins over billing throughput.
When the reduction applies, any LinkedIn accounts you have voluntarily disconnected during the period are released through our standard 7-day post-period grace cron (the same one that runs for full subscription cancellations). Connected accounts at apply time stay connected — billing simply stops billing for them next cycle (subject to the seat-count vs. connected-account check above).
FAQ
Q: Why am I being charged immediately when I add seats but not refunded when I remove them? A: The model mirrors how the parent subscription works. When you cancel your main WarmySender subscription mid-period, you are not refunded for the unused days — you keep access until the period ends. The same rule now applies to LinkedIn seats: pay for the period, keep what you paid for. This is the standard SaaS pattern and it keeps billing simple and fair for everyone.
Q: I added 3 seats and the charge shows up immediately. Is that normal? A: Yes. Effective May 7, 2026, all seat additions trigger an immediate prorated charge for the days remaining in your current billing period. The new seats are available within seconds. If your card was declined, the seat increase is refused — your card is never partially charged for a refused increase.
Q: I removed seats and expected a refund. Where is it? A: No refund is issued. Reductions schedule for the next billing date. You keep the seats — and pay for them — through the end of the current period. On the next renewal, you are billed for the new lower count.
Q: How do I see when a scheduled reduction will apply? A: Open Billing. If you have a scheduled reduction, the page shows 'Current: N seats — Reduces to M on $DATE — [Cancel scheduled reduction]'. The date is your next billing date.
Q: Can I cancel a scheduled reduction? A: Yes, anytime before the period rolls over. Click 'Cancel scheduled reduction' on the Billing page. Your seat count stays at the original number and the next renewal bills accordingly.
Q: My card was declined when I tried to add a seat. What happens? A: The seat is not added. Your card is not partially charged. Update your payment method on the Billing page and try again — the seat will be added and charged on the successful retry.
Q: What happens if my card is declined when adding seats? A: Your seats are not added. We retrieve the resulting Stripe invoice and check the payment status — if it requires authentication (3D Secure), we show you a button to complete authentication. If declined, we show a clear message and don't update your seat count. No partial state.
Q: Can I see all my LinkedIn add-on purchases separately? A: Yes. The billing page lists each add-on purchase as its own card with the date you added it, the seat count, and the price tier. You can cancel or reduce each one independently.
Q: I subscribe annually. How does this work for me? A: The same logic applies, just stretched over the year. Adding a seat charges immediately for the prorated cost through your annual renewal date. Removing a seat schedules the reduction for the annual renewal date — no refund for the remainder of the year.
Q: Will my running campaigns be interrupted when a scheduled reduction applies? A: Only if you have more connected accounts than the post-reduction seat count at apply time, in which case the reduction is REFUSED and stays scheduled for the next cycle (the platform never auto-disconnects an account in a billing path). Otherwise, campaigns on the still-existing seats continue normally; the seat count just decreases on your invoice.
Q: How can I see the audit history of my seat changes? A: Email [email protected] with your account email. We can pull the full timeline of seat additions, scheduled reductions, applied reductions, and cancellations from the audit log.
Your LinkedIn account can show as disconnected for several reasons — most of them are LinkedIn requiring re-authentication for security, not a bug on our side. WarmySender pauses your campaigns automatically the moment we detect a disconnect, because sending while the account is in a half-authenticated state is exactly how LinkedIn detects automation and restricts accounts.
The LinkedIn account status lifecycle WarmySender connects to LinkedIn through a specialist integration partner, which reports each connected account in one of these states:
Connected — Account is fully authenticated. Sends proceed normally.
Reconnect needed — LinkedIn invalidated the session. You need to re-enter your password (and 2FA code if enabled). Most common reason for disconnects.
Verification required — LinkedIn is asking for additional verification (CAPTCHA, security challenge, suspicious activity check). You need to log into LinkedIn directly in a browser, complete the challenge, then reconnect through WarmySender.
Link lost — a rare internal tracking inconsistency. Reconnect and try again.
When we detect any state other than Connected, your LinkedIn campaigns associated with that account are automatically paused.
Why LinkedIn forces re-authentication (not your fault) Common triggers, all initiated by LinkedIn for security:
Password change on LinkedIn
2FA reset or new device verification
Idle session expired (LinkedIn's session windows are not advertised but vary)
IP region change detected (e.g. you logged in from a different country, or your VPN/proxy IP rotated)
Suspicious activity flag (false positives happen, especially after a busy day)
LinkedIn rolled their auth tokens platform-wide (rare)
None of these are caused by WarmySender. The frequency depends on your LinkedIn account's history and how often you log in elsewhere. Some accounts go months without a disconnect; others need re-authentication every few weeks.
What WarmySender does automatically when an account disconnects
1. We detect the disconnect within minutes (our integration partner notifies us, and a periodic health check catches anything the notification missed). 2. We immediately pause every campaign attached to that account, with the pause hint 'LinkedIn account disconnected'. 3. No further sends are attempted on that account until you reconnect. 4. Existing prospects in mid-sequence keep their place — nothing is lost. They wait at their current step. 5. If the disconnect persists for more than 24 hours, we email you a 'Your LinkedIn account [Name] disconnected — paused N campaigns' message with a one-click reconnect link.
How to reconnect
1. Go to Settings → LinkedIn Accounts (or LinkedIn → Accounts in the sidebar). 2. Find the disconnected account — it will show a red status pill and a 'Reconnect' button. 3. Click 'Reconnect'. You'll be redirected to a hosted authentication page (no password is shared with WarmySender). 4. Complete LinkedIn's verification: enter your password, 2FA code if requested, and resolve any CAPTCHA or in-app validation challenge. 5. Return to WarmySender. The account status flips back to 'connected' within seconds.
Do I need to manually unpause my campaigns? In most cases, no — campaigns paused because the LinkedIn account disconnected resume automatically on the next scheduler tick after reconnection. The platform also resets the failure-rate window on every campaign attached to the just-reconnected account, so a backlog of dead-account-era errors won't immediately re-pause the campaign on resume.
However, if a campaign was paused for any OTHER reason at the same time (e.g. high failure rate from before the disconnect, manual pause, or a different downstream issue), it may still need manual resume from the campaign's settings. If you click Resume and the campaign immediately re-pauses, contact support — that signals a stale failure window that needs manual reset.
If your LinkedIn add-on seat was canceled If the disconnect happened because your LinkedIn add-on seat was canceled (not because LinkedIn force-logged you out), the reconnect flow routes you to Billing instead. Add a seat back, and the existing campaigns and audiences stay intact.
Why frequent disconnects can happen on free LinkedIn accounts Free LinkedIn accounts have stricter session policies than Premium / Sales Navigator. If you experience repeated disconnects on a free account, the long-term fix is upgrading to a paid LinkedIn tier — they get longer session windows, fewer security challenges, and higher per-account daily caps.
FAQ:
Q: My account shows 'connected' but campaigns are paused. Why? A: The disconnect probably resolved automatically (LinkedIn re-validated the session in the background) but the campaigns kept their previous pause reason from the disconnect window. The auto-resume sweeper runs every 5 minutes, so give it one tick first. If a campaign is still paused after that, open it and read the pause hint. If the hint points at billing — an unpaid invoice or an inactive subscription — settling the invoice is the only thing that clears it, and everything resumes on its own within about a minute afterwards; there is no button to press. For any other reason, press Resume on the campaign. If it re-pauses immediately, contact support.
Q: Will my prospects be lost during a disconnect? A: No. Every prospect's position in the sequence is preserved. When the campaign resumes, prospects continue from exactly the step they were on, including any 'wait for acceptance' or 'wait N days' delays that were in flight.
Q: How long do I have to reconnect? A: Indefinitely — there's no deadline. But the longer you wait, the more pent-up backlog builds in your campaigns. After reconnecting, the platform respects per-account daily caps, so a long disconnect won't be 'caught up' in a burst.
Q: Can I prevent disconnects? A: Mostly no — they're triggered by LinkedIn's security, not by us. Things that help: don't log into LinkedIn from new devices/IPs while your WarmySender account is active, don't change your LinkedIn password during a campaign, and consider upgrading from a free LinkedIn account to Premium if you're hit with frequent disconnects.
If your LinkedIn account dashboard shows 'Reconnect needed', 'Linking — finishing connection', or 'Linking — taking longer than expected', this guide explains what each badge means, why it happens, and how to fix it in under a minute. The platform always tells the truth about current state — the pill never lies about the row's actual health.
The short version
LinkedIn rotates the session tokens that authenticate your account roughly every 30 days, plus immediately on any suspicious-login signal (new device or IP, password change, 2FA reset, security challenge). When the token expires, our integration partner reports the account as needing fresh credentials — and we surface that to you as 'Reconnect needed'. A 1-hour watcher also detects accounts that finished the LinkedIn sign-in on the partner's side but never linked back to us (a rare timing race), so even if an account is stuck in 'Linking…', it self-heals within an hour.
What each status pill means
Connected · last activity Xh ago (green dot) — The account is fully authenticated and we recently completed a successful LinkedIn action on it (sync, send, or health check). 'Last activity' is the time of that most recent successful action. If it is older than 24 hours and you have campaigns enrolled, contact support.
Linking — finishing connection (blue dot, spinner) — Your sign-in completed in the last 5 minutes and our integration partner is finalising the handshake. Most of these resolve in under 60 seconds. No action is needed; just wait.
Linking — taking longer than expected (amber dot) — The 'connecting' state has lasted more than 5 minutes. This is rare. The watcher will re-link the account automatically within 60 minutes if the sign-in did complete on the partner's side. Try clicking 'Reconnect' from the account's menu, or contact support if it persists past 30 minutes.
Reconnect needed (amber dot) — LinkedIn invalidated the session token. You need to click 'Reconnect Account' and complete a fresh login (password + 2FA if enabled). Campaigns auto-pause until you reconnect; they auto-resume within 5 minutes after.
Verification Required (yellow dot) — LinkedIn is asking for an in-app challenge (CAPTCHA, security question, suspicious-activity check). Click 'Reconnect' and complete the challenge as you would any normal LinkedIn login.
Restricted (red dot) — LinkedIn has restricted the account on their side. Most restrictions auto-lift in 24-48 hours. Reconnect after the restriction clears.
Disconnected (gray dot) — The account was disconnected by you or by the platform. Click 'Reconnect' to restore it.
Why LinkedIn forces re-authentication (the real reason)
LinkedIn issues every authenticated session a short-lived token. That token is what proves to LinkedIn each action (sending an invite, fetching a profile, posting a comment) is coming from you, not a bot. LinkedIn rotates these tokens for security — the same way your bank logs you out periodically. When the token expires or is invalidated, our integration partner reports that LinkedIn's credential check no longer passes and a fresh login is required.
Common triggers, all initiated by LinkedIn — not by WarmySender:
Routine ~30-day rotation (most common; happens to every account, even healthy ones)
Password change on LinkedIn
2FA reset or new device verification
IP region change (logged in from a different country, or your VPN/proxy IP rotated)
LinkedIn security challenge or CAPTCHA
Idle session — the account was not actively used for a while
Premium and Sales Navigator accounts get longer windows than free accounts, but every account eventually rotates.
The auto-relink guarantee (1-hour watcher)
If an account ever gets stuck in 'Linking — finishing connection' for more than 5 minutes, the platform detects it and self-heals automatically. The watcher runs hourly and looks for accounts that finished the LinkedIn sign-in on our integration partner's side but never sent the confirmation back to us (a rare network race). When it finds one, it links the account back to its live LinkedIn session, flips the status to Connected, records the change in your account history, and resumes any paused campaigns.
In practice this means: even if you see 'Linking — taking longer than expected' right now, you do not need to do anything. Wait up to 60 minutes and the watcher will fix it. If it still hasn't relinked after an hour, then click Reconnect or contact support.
How to reconnect (4 steps, ~30 seconds)
1. Open WarmySender and click LinkedIn → Accounts in the sidebar (or click the link in the reconnect email). 2. Find the affected account showing the amber 'Reconnect needed' badge. Click the menu (⋮) on that row and choose 'Reconnect'. 3. You'll be routed to a hosted re-authentication page. Enter your LinkedIn email and password. If 2FA is enabled, enter the code. If LinkedIn shows a security challenge or CAPTCHA, complete it as you would any normal LinkedIn login. WarmySender never sees your password — our LinkedIn provider handles the secure handshake with LinkedIn directly. 4. Return to WarmySender. The pill flips to green 'Connected · last activity moments ago' within seconds. Campaigns auto-resume within 5 minutes.
What happens after you reconnect
The self-heal sweeper runs every 5 minutes and automatically resumes any campaign that was paused because its LinkedIn account disconnected, once that account is back to Connected. You do not need to manually click Resume on each campaign. The platform also clears the failure-rate window so dead-account-era errors don't immediately re-pause anything. Account safety still wins on resume — sends respect your daily and weekly LinkedIn caps, sending window, ramp schedule, and active days. There is no burst catch-up of held-back invites, ever.
FAQ
Q: Why did my account disconnect even though it's in good standing? A: LinkedIn rotates session tokens for security every ~30 days, regardless of account standing. Even healthy, paid Sales Navigator accounts that have never been restricted hit the rotation. Premium and Sales Navigator typically rotate less frequently than free accounts, but no account is exempt.
Q: My pill shows 'Linking — taking longer than expected'. Did something break? A: Probably not. The OAuth callback hasn't fully landed yet on our side. The 1-hour orphan watcher self-heals these. If it's been more than an hour, click Reconnect from the account menu or contact support.
Q: Why does the pill show 'First connected on 30/04/2026' below the status? A: That's the historical first-connect date, kept as context. The live pill above it shows the row's CURRENT state (connected / linking / reconnect needed). We deliberately split these two so the pill never lies about current health while the historical date stays visible for users who want it.
Q: Will I lose my pending invites or data when I reconnect? A: No. Pending invites stay on LinkedIn — they're independent of WarmySender's connection state. Your prospects, audiences, conversations, sequences, sent metrics, and analytics are stored on our side and untouched by the reconnect. When campaigns resume, every prospect picks up at the exact step they were on.
Q: How long do I have to reconnect? A: Indefinitely. There's no hard deadline. But the longer you wait, the more pent-up backlog builds. After reconnecting, the platform respects per-account daily and weekly caps, so a long disconnect won't be 'caught up' in a burst — throughput rolls back to normal over the next 1-2 weeks.
Q: Is reconnecting safe? Will it trigger a flag on my LinkedIn account? A: Yes, it's safe. Reconnect uses LinkedIn's official authentication flow — the same secure handshake you use when you log in from a browser. No password is stored on our side, no 2FA is bypassed, no stale tokens are reused. LinkedIn treats it like any other normal login.
Q: Can I leave the account disconnected and reconnect later? A: Yes. Leaving an account disconnected is harmless — campaigns just stay paused at their current step. There's no penalty, no data loss, no LinkedIn-side flag for taking your time.
Q: I just reconnected but my campaigns are still paused. What now? A: The auto-resume sweeper runs every 5 minutes — give it one tick. If campaigns are still paused 10 minutes after reconnect, check that the LinkedIn account on LinkedIn → Accounts shows green 'Connected'. If green but campaigns still paused after 15 minutes, the campaigns may have an additional pause reason (manual pause, stuck-loop, subscription) — open the campaign and check the pause hint, then click Resume. If Resume immediately re-pauses, email support.
Q: I see two LinkedIn cards for the same person — why? A: This is a duplicate-OAuth pattern — almost always caused by clicking 'Reconnect' twice in quick succession before the first attempt finished its handshake. Each click previously issued a fresh OAuth session, so two live sessions ended up linked to the same LinkedIn identity (one with stale credentials, one with fresh). As of 2026-04-30 (Phase 5b follow-up F3), the Reconnect route caches the in-flight URL for 90 seconds so a second click within window returns the SAME reconnect URL — duplicates can no longer be created this way going forward. If you have an existing duplicate from before the fix, click the menu (⋮) on the older card and choose 'Disconnect'. Your campaigns are linked to the active card, so removing the older one is safe. If you're unsure which is which, email [email protected] with both account IDs and we'll confirm before you delete.
Q: Why does my account sometimes show 'Linking — finishing connection' for a long time? A: When you complete the LinkedIn sign-in, the handshake has to land on three sides — LinkedIn, our integration partner, and WarmySender. In the rare case the final confirmation back to us fails or arrives out of order (a network race), the live session exists on the partner's side but your account stays in 'Linking' for longer than the usual sub-60-second window. The pill correctly shows 'Linking — finishing connection' (blue, spinner) for the first 5 minutes and 'Linking — taking longer than expected' (amber) after that. The hourly watcher detects accounts in exactly that state and self-heals: it links the account back to its live session, flips the status to Connected, and records the change in your account history. So even in the worst case, the pill clears within the hour without any action from you. If it persists past 60 minutes, click 'Reconnect' from the account menu — a 90-second safety window means a single retry can't create a duplicate session.
Q: Why am I getting 'reconnect needed' emails when my dashboard already shows the account as connected? A: This is a stale internal health marker left over from an earlier LinkedIn-side or partner-side outage. Your account is genuinely connected and we are communicating with LinkedIn fine — but the marker didn't reset when the reconnect succeeded, and the daily health alert email kept firing on it. As of 2026-04-30, reconnecting resets that marker alongside the other recovery markers, the alert email now skips any account that is currently connected, and a 30-minute drift check surfaces any future regression to us before you would ever see it. Your campaigns, prospects, audiences, conversations, and pending invites are completely untouched by the fix — nothing is re-sent and no LinkedIn action is taken on your behalf. If you still see the email, click Reconnect once from LinkedIn → Accounts and the marker resets cleanly on the next check.
Q: Will the system ever remove my connected LinkedIn account without asking? A: No. Account safety always wins on anything destructive. Removal is guarded several layers deep: the automated cleanup is switched off by default; if it ever tried to act on more than a handful of accounts at once it aborts and raises an internal alert instead of proceeding; each individual account has to be confirmed as genuinely gone three separate times, a minute apart, before anything is removed; there is a hard ceiling of three removals in any 24-hour window; and every status change has to be recorded in your account history in the same step or it is rejected outright. On top of that, cleanup at the end of a subscription is non-destructive by default and gives you a 7-day grace period. The only removals that have actually run in 2026 were deliberate, one-off actions on inert duplicate sessions, after the real accounts had already been re-linked. You will never see a silent bulk cleanup, and any removal that does run raises an internal alert on our side.
Related guides: 'Why did my LinkedIn account disconnect — and how to reconnect' (longer deep-dive on the routine 30-day rotation, with auto-resume detail) at /documentation/linkedin-disconnect-and-reconnect; 'LinkedIn Campaign Documentation' (how active days, sending windows, and the ramp interact, and why acceptance can lag 1-3 days) at /documentation/linkedin; 'Why does my LinkedIn account show as disconnected?' (the full account status lifecycle: Connected, Reconnect needed, Verification required) at /documentation/linkedin-account-disconnected.
If your LinkedIn account suddenly shows a 'Reconnect' badge in WarmySender — and your campaigns paused on their own — this is almost always a routine LinkedIn session refresh, not a bug. This guide explains the cause in plain language, exactly what you'll see, how to fix it in under a minute, and what happens to your data.
The short version
LinkedIn rotates the session tokens that authenticate your account every ~30 days, and immediately on suspicious-login signals (new device or IP, password change, 2FA reset, security challenge). Our integration partner cannot silently refresh those tokens for security reasons — LinkedIn would flag a silent rebind as automation. The safest fix is for you to re-trigger the login flow once. Click the Reconnect button on the account, sign into LinkedIn, and you're done. Campaigns auto-resume within 5 minutes.
Why LinkedIn forces a re-login (the real reason)
LinkedIn issues every authenticated session a short-lived token. That token is what proves to LinkedIn that an action (sending an invite, fetching a profile, posting a comment) is coming from you, not a bot. LinkedIn rotates these tokens for security — exactly the same way your bank logs you out periodically. When the token expires or is invalidated, our integration partner reports that LinkedIn's credential check no longer passes and a fresh login is required. Common triggers for this status:
Routine ~30-day rotation (most common; happens to every account, even healthy ones)
Password change on LinkedIn
2FA reset or new device verification
IP region change (you logged in from a different country, or your VPN/proxy IP rotated)
LinkedIn security challenge or CAPTCHA in the meantime
Idle session — the account was not actively used for a while
None of these are caused by WarmySender. Premium and Sales Navigator accounts get longer windows than free LinkedIn accounts, but every account eventually rotates.
What you'll see in WarmySender
When we detect the disconnect (within ~5 minutes via our LinkedIn provider webhook + periodic health check), the platform takes three actions immediately:
1. The LinkedIn account row on LinkedIn → Accounts shows an amber or red 'Reconnect' badge next to the account name. The status pill switches from green 'Connected' to 'Reconnect needed'. 2. Every campaign attached to that account is auto-paused because its LinkedIn account is disconnected. The campaign card shows a small hint: 'Will auto-resume after LinkedIn account reconnection.' 3. If the disconnect persists for more than 24 hours, we email you a one-click reconnect link from [email protected] with the subject 'Your LinkedIn account [Name] needs to be reconnected'. Clicking that email link drops you directly on the reconnect screen — no login to WarmySender required first.
How to reconnect (4 steps, ~30 seconds)
1. Open WarmySender and click LinkedIn → Accounts in the sidebar (or click the link in the reconnect email). 2. Find the affected account — it shows the amber 'Reconnect' badge. Click the 'Reconnect Account' button on that row. 3. You'll be routed to a hosted re-authentication page. Enter your LinkedIn email and password. If 2FA is enabled, enter the code. If LinkedIn shows a security challenge or CAPTCHA, complete it as you would any normal LinkedIn login. WarmySender never sees your password — our LinkedIn provider handles the secure handshake with LinkedIn directly. 4. Return to WarmySender. The status pill flips back to green 'Connected' within seconds.
What happens after you reconnect
The self-heal sweeper runs every 5 minutes and automatically resumes any campaign that was paused because its LinkedIn account disconnected, once that account is back to Connected. You do not need to manually click Resume on each campaign. The platform also clears the failure-rate window so dead-account-era errors don't immediately re-pause anything. Account safety still wins on resume — sends respect your daily and weekly LinkedIn caps, sending window, ramp schedule, and active days. There is no burst catch-up of held-back invites, ever.
A campaign paused for any OTHER reason at the same time (manual pause, stuck-loop pause, subscription issue) may still need a manual Resume from its settings page. If you click Resume and it immediately re-pauses, contact support — that signals a stale failure window or a separate issue.
When to ask support
If reconnect fails twice in a row.
If the account stays stuck in 'Connecting…' status for more than 30 minutes.
If the account flips back to 'Reconnect needed' within an hour of a successful reconnect (this can mean a stale safety check on our side — a known edge case we are actively patching).
If you see frequent (more than once-a-week) disconnects on a Premium / Sales Navigator account.
Email [email protected] with the LinkedIn account email and approximate reconnect time. We'll dig into the specific row.
FAQ
Q: Will I lose my pending invites? A: No. Pending invites stay on LinkedIn — they are independent of WarmySender's connection state. Any invite already delivered to a prospect will still appear in their LinkedIn invitation queue, and any acceptance will still flow back to your dashboard via the 6h polling fallback even if the webhook missed it during the disconnect.
Q: Will recipients see I went offline, or that something changed? A: No. The disconnect is purely between WarmySender's integration layer and LinkedIn's auth system. From the recipient's point of view, nothing changed — you appear online or offline on LinkedIn exactly as you would normally. They never see a 'this user disconnected from a tool' signal because no such signal exists.
Q: Will I lose my campaign data, prospects, or audiences? A: No. Reconnecting only refreshes the auth token between WarmySender and LinkedIn. Your prospects, audiences, conversations, campaign sequences, sent metrics, and historical analytics are stored on our side and are completely untouched by the reconnect. When campaigns resume, every prospect picks up at the exact step they were on, including any 'wait for acceptance' or 'wait N days' delays in flight.
Q: How long do I have to reconnect? A: Indefinitely — there's no hard deadline. But the longer you wait, the more pent-up backlog builds in your campaigns. After reconnecting, the platform respects per-account daily and weekly caps, so a long disconnect won't be 'caught up' in a burst — throughput rolls back to normal over the next 1-2 weeks.
Q: Why does this happen even though my account is in good standing? A: LinkedIn's session rotation is unrelated to account standing. Even healthy, paid Sales Navigator accounts that have never been restricted hit the ~30-day rotation. Premium and Sales Navigator typically rotate less frequently than free accounts, but no account is exempt.
Q: Is reconnecting safe? Will it trigger a flag on my LinkedIn account? A: Yes, it's safe. Reconnect uses LinkedIn's official authentication flow — the same secure handshake you use when you log into LinkedIn from a browser. No password is stored on our side, no 2FA is bypassed, and no stale tokens are reused. LinkedIn treats reconnect exactly like any other login from your normal IP and device.
Q: Can I just leave the account disconnected and reconnect later when I have time? A: Yes. Leaving an account disconnected is harmless — campaigns just stay paused at their current step. There's no penalty, no data loss, and no LinkedIn-side flag for taking your time. Reconnect when you're ready and everything resumes.
Q: I just reconnected but my campaigns are still paused. What now? A: The auto-resume sweeper runs every 5 minutes — give it one tick. If campaigns are still paused 10 minutes after reconnect, check that the LinkedIn account on LinkedIn → Accounts shows green 'Connected' (sometimes the LinkedIn-side handshake takes a few extra seconds to complete). If the account is green but campaigns are still paused after 15 minutes, they have an additional pause reason — open the campaign and read the pause hint. If the hint points at billing (an unpaid invoice, an expired trial, or an inactive subscription), settling the invoice is the only thing that clears it: everything resumes on its own within about a minute afterwards, and there is no button to press. If the hint points at a manual pause or a stuck step, press Resume on the campaign. If Resume immediately re-pauses, email support.
For platform-wide reconnects after a major infrastructure rollout, see the separate 'Reconnecting your LinkedIn account after a platform update' guide.
Related guides: 'Why does my LinkedIn account show as disconnected?' (the full account status lifecycle), 'LinkedIn campaign auto-pause and resume' (campaign-side behavior), 'LinkedIn account safety and ramp' (why we never burst after a gap).
The 'acceptance rate' on your LinkedIn campaign dashboard is the percentage of sent invites that have been accepted by the prospect on LinkedIn. It is a real-time number, but it can lag the actual acceptance event by minutes (typically), hours (occasionally), or up to a day in rare cases — because of how LinkedIn delivers acceptance signals to us.
How we detect acceptances
There are two paths an acceptance signal can travel from LinkedIn into your dashboard:
Path A: Webhook (the fast path, usually seconds) When someone accepts your LinkedIn invite, LinkedIn fires an internal event. Our LinkedIn integration partner catches that event and notifies us immediately. We then record the acceptance time on the prospect, advance them to the next step in your campaign sequence (e.g. 'send first message' after a 1-hour delay), and updates the acceptance count on your dashboard. End-to-end this is usually 5-30 seconds.
Path B: Polling fallback (catches anything the webhook missed, every 6 hours) LinkedIn's webhook delivery is not 100% reliable — it's network-based, and small fractions get dropped, delayed, or held in queues during incidents. To make sure no acceptance is ever silently missed, every 6 hours we poll each connected LinkedIn account's relations list (i.e. who is now your 1st-degree connection that wasn't yesterday) and reconcile any acceptance the webhook missed. The acceptance gets stamped with the actual time it happened, and your dashboard updates.
What 'pending' vs 'accepted' means
Pending — Your invite was sent and delivered to the prospect's invitation queue, but they have not accepted yet. They may accept later, ignore it, or decline.
Accepted — The prospect clicked Accept on LinkedIn. They are now your 1st-degree connection. We've received either the webhook or the 6h poll signal confirming this. Your campaign now routes them to the next step (typically the first follow-up message).
Withdrawn — You manually withdrew the invite, or it expired (LinkedIn auto-expires invitations after 6 months).
Why your acceptance rate may temporarily look low
Day 0 (campaign launch): 0% accepted is normal. People rarely accept invites within hours of receiving them. Most acceptances happen 1-3 days later.
Day 1-2: Real-world acceptance rate for cold LinkedIn invites is typically 20-40% (well-targeted), 40-60% (highly targeted with personalized notes), or 5-15% (untargeted). At Day 1, you should expect around 5-10% accepted because not everyone has logged into LinkedIn yet.
Day 3-7: Acceptance rate stabilizes near its true value. By Day 7 you have a meaningful number to evaluate.
If you sent invites yesterday and see '0% accepted' today, that is most likely correct — not a bug. Wait 48-72 hours before judging.
When the dashboard might mislead you
There is one known display issue we are fixing: in some cases the campaign overview page (the campaign list, not the per-campaign analytics page) reads acceptance rate from the wrong field and shows 0% even when the underlying data is correct. If you see 0% on the campaign list but the per-campaign analytics page shows real numbers, the data is correct — the list is wrong. The fix is shipping shortly. If you want the most accurate number, click into the campaign and view its analytics page.
If you suspect detection is broken
Detection is the system that records acceptances, not just the display. Detection is broken if you can confirm (via LinkedIn directly) that a specific person accepted your invite more than 24 hours ago AND your dashboard shows them as still 'pending'. To check:
1. Open LinkedIn in a browser, find the prospect's profile, and confirm you are 1st-degree connected. 2. Go to the prospect in WarmySender (LinkedIn → Audiences or via the campaign's prospect list). 3. Check the prospect's status. If LinkedIn shows you connected for >24h but WarmySender still shows 'pending', email [email protected] with the prospect's LinkedIn URL and the campaign name.
We page on-call automatically if no acceptance webhooks have been received platform-wide for >12 hours, so we usually catch broad outages before customers notice. But individual edge cases can still slip through.
Reading the dashboard correctly
Invited — count of unique prospects we sent an invite to.
Accepted (and acceptance rate) — count and percentage of those invites accepted so far.
Replied — count of prospects who replied to your follow-up message after accepting.
A healthy connection-then-message campaign typically shows: 30-50% acceptance rate, then 10-25% reply rate among accepted prospects. If acceptance is healthy but reply rate is very low, the issue is your message template, not the platform.
Audiences are collections of LinkedIn profiles used as targets for LinkedIn campaigns:
Creating Audiences:
From Find Prospects — Run a LinkedIn search, select profiles, and save them to a new or existing audience
Manual — Create an empty audience and add profiles individually
Import — Upload a CSV with LinkedIn profile URLs
Profile Enrichment: Enrichment fetches full profile data for each prospect in an audience — name, headline, company, location, job title, connection degree, and profile picture. This data enables personalization in your campaign messages using merge tags like {{firstName}}, {{company}}, and {{headline}}.
How Enrichment Works:
The system processes profiles in small batches (up to 15 per tick, every 3 minutes) to mimic natural LinkedIn browsing.
Each profile is fetched individually through your connected LinkedIn account — the same way you would view a profile manually on LinkedIn.
A daily cap limits how many profiles can be enriched per day based on your account strategy (see below).
When the daily cap is reached, enrichment pauses automatically and resumes at midnight UTC.
Enrichment results are cached for 30 days — if the same profile appears in another audience, cached data is reused instantly (no API call needed).
Enrichment Daily Caps (per account strategy): • New Account (week 1): ~10 profiles/day, increasing to 60/day by week 6 • Established (week 1): ~30 profiles/day, increasing to 80/day by week 4 • Veteran (week 1): ~50 profiles/day, increasing to 100/day by week 2 • Recovery: ~5 profiles/day, increasing to 30/day by week 8 These caps protect your LinkedIn account from being flagged for excessive profile viewing.
Estimated Enrichment Times: The Audiences page shows an estimated time remaining based on your daily cap. For large audiences on new accounts, enrichment can take multiple days. Examples: • 100 profiles on a veteran account: ~1-2 days • 500 profiles on a new account (week 1): ~50 days at 10/day cap • 1,000 profiles on an established account: ~13-33 days depending on ramp week As your account ages and advances through ramp weeks, the daily cap increases and enrichment speeds up.
Why Enrichment Uses Your LinkedIn Account: LinkedIn requires an authenticated session to view profile data — there is no public API or way to access profiles without a logged-in account. Using a shared 'system' account is not possible because: • LinkedIn actively detects and bans accounts that view profiles at scale from a single source • A shared account would be banned within hours, affecting all users • Your own account sees network-specific data (connection degree, mutual connections) that a third-party account cannot access • This is how all LinkedIn automation tools work — each user must use their own authenticated account
Is Enrichment Required to Start a Campaign? No — enrichment is completely optional. You can create and launch a LinkedIn campaign immediately without waiting for enrichment to complete. Campaigns use LinkedIn profile URLs to send connection requests and messages. Enrichment simply adds extra profile details (name, company, headline) that enable richer personalization with merge tags. If enrichment is incomplete, campaigns still work — you just may have fewer personalization fields available for unenriched profiles.
Audience-to-Prospect Linking: Enriched profiles are automatically linked to your Prospects table. LinkedIn-specific fields are populated: member ID, profile URL, headline, company, and location.
Using Audiences in Campaigns: When creating a LinkedIn campaign, select one or more audiences as the target. Prospects from the audience are enrolled into the campaign steps. You can start the campaign immediately — enrichment continues in the background and data becomes available as profiles are enriched.
FAQ:
Q: Why is my enrichment showing 16 days remaining? A: The daily cap depends on your account strategy and ramp week. New accounts start with a low cap (~10 profiles/day) to protect your LinkedIn account. As your account ages and progresses through ramp weeks, the cap increases. For large audiences (500+ profiles), initial enrichment can take multiple days. You do not need to wait — start your campaign now and enrichment will continue in the background.
Q: My enrichment stopped or failed — what happened? A: Common causes: 1) Your LinkedIn account disconnected during enrichment — reconnect from LinkedIn > Accounts and restart enrichment. 2) Daily cap reached — enrichment pauses until midnight UTC and resumes automatically. 3) Circuit breaker triggered — if too many errors occur (10+ in a day), enrichment stops to protect your account. Reconnect your account and retry.
Q: Can I speed up enrichment? A: The enrichment rate is intentionally conservative to protect your LinkedIn account. Faster enrichment would risk LinkedIn restrictions or bans. As your account moves to higher ramp weeks (2-6 weeks after connection), the daily cap automatically increases. Veteran accounts (1+ year old) have the highest caps.
Q: Does enrichment count toward my LinkedIn daily limits? A: Yes, enrichment uses profile view API calls that share the daily limit with campaign 'View Profile' steps. If you have active campaigns with profile view steps, they share the same daily cap.
Tip: Build targeted audiences using Sales Navigator filters for best results. Quality over quantity — a smaller, well-targeted audience will outperform a large, generic one.
Create and manage LinkedIn-only outreach campaigns from the LinkedIn section.
Creating a LinkedIn Campaign:
Go to LinkedIn > Campaigns from the sidebar.
Click 'Create Campaign' and give your campaign a name.
Select the LinkedIn account to use for sending.
Select an audience — choose one or more audiences as campaign targets.
Define your campaign steps — build a sequence using LinkedIn action types.
Do I Need to Wait for Enrichment? No. You can create and start a LinkedIn campaign immediately, even if your audience is still being enriched or has not been enriched at all. Campaigns only need LinkedIn profile URLs to function — they can send connection requests, messages, and InMails using the profile URL alone. Enrichment adds extra data (name, company, headline) for personalization, but it is not a prerequisite. Start your campaign now and enrichment will continue running in the background. As profiles are enriched, personalization data becomes available for subsequent campaign steps.
Campaign Types:
Connection Request then Message — Send an invite, wait for acceptance, then follow up with a direct message. Most common approach for warm outreach.
InMail Sequences — For reaching non-connections using LinkedIn Premium or Sales Navigator InMail credits. No connection request needed.
Mixed sequences — Combine profile views, connection requests, messages, and InMails with conditional branches based on whether the prospect accepted or replied.
Daily Limits & Sending Windows: Set daily action limits per campaign to stay within safe thresholds. Configure sending windows (start/end hours and timezone) and active days to control when LinkedIn actions are executed. The system enforces account-level safety limits on top of your campaign settings.
Monitoring Active Campaigns: Track key metrics from the campaign dashboard: • Invites Sent — Total connection requests dispatched • Accepted — How many prospects accepted your invite • Messages Delivered — Direct messages and InMails sent • Replies — Number of prospect responses
Managing Campaigns:
Pause — Temporarily stop all actions while preserving progress. Prospects stay at their current step.
Resume — Continue a paused campaign from where it left off.
Complete — Mark a campaign as finished. No further actions will be sent.
Campaigns are automatically paused if your LinkedIn account is disconnected or restricted.
FAQ:
Q: My audience says enrichment is in progress — can I still start my campaign? A: Yes. Enrichment is a background process that adds profile details for personalization. Your campaign will start immediately using the LinkedIn URLs in your audience. You do not need to wait for enrichment to complete.
Q: Will my campaign messages be less effective without enrichment? A: If you use merge tags like {{firstName}} or {{company}} in your message templates, those fields will only be populated for enriched profiles. For unenriched profiles, you can set Liquid syntax fallbacks (e.g., {{firstName | default: 'there'}}) to handle missing data gracefully. Connection requests without personalization still work — you can always send blank invites.
Q: My campaign shows 0 prospects enrolled — what went wrong? A: This usually means your audience has no profiles with LinkedIn URLs, or the profiles could not be matched. Check your audience on the Audiences page to verify it has profiles. If you imported via CSV, make sure the linkedinUrl column was mapped correctly.
View and manage LinkedIn post engagement from the LinkedIn section.
Accessing Posts: Go to LinkedIn > Posts from the sidebar to see post activity across your connected LinkedIn accounts.
Post Engagement: Track how your LinkedIn posts are performing and manage engagement. Use post activity as a touchpoint in your outreach strategy — engaging with a prospect's posts before reaching out can significantly increase connection acceptance and reply rates.
Tracking Performance: Monitor key post metrics to understand what content resonates with your audience. Use these insights to refine your LinkedIn content strategy and support your outreach efforts.
Automate LinkedIn post engagement through the WarmySender REST API. The LinkedIn Likes API lets you programmatically add reactions to posts using API key authentication — perfect for AI agents, CRM integrations, and automated outreach workflows.
Getting Started:
Go to Settings > API Keys and create a new API key.
Select the 'linkedin:read' and 'linkedin:write' scopes.
Copy your API key (shown once — save it securely).
Use the key in the Authorization header: Authorization: Bearer YOUR_API_KEY
Available Endpoints:
GET /api/v1/linkedin/accounts — List your connected LinkedIn accounts with daily engagement limits and remaining quota.
POST /api/v1/linkedin/posts/{postId}/reactions — Add a reaction to a LinkedIn post. Requires linkedin_account_id and optional reaction_type (LIKE, CELEBRATE, SUPPORT, LOVE, INSIGHTFUL, FUNNY) in the request body.
GET /api/v1/linkedin/posts/{postId}/reactions — List all reactions on a post. Requires linkedin_account_id as a query parameter.
Post ID Format: The postId is the LinkedIn post URN in the format 'urn:li:activity:1234567890'. When placing it in the URL path, URL-encode the colons: urn%3Ali%3Aactivity%3A1234567890
Account Safety & Rate Limits: Daily engagement limits are enforced per LinkedIn account based on account age and strategy. This protects your LinkedIn account from being flagged: • New accounts (< 6 months): Start at 5 engagements/day, ramp to 30 over 6 weeks • Established accounts (6-12 months): Start at 15/day, ramp to 40 over 4 weeks • Veteran accounts (1+ year): Start at 25/day, ramp to 50 over 2 weeks • Recovery (after restriction): Start at 2/day, very slow 8-week ramp to 15/day The API returns 429 with details when the daily limit is reached.
Use Cases:
1. AI Sales Agents — Build AI agents that engage with prospects' posts before sending connection requests. Liking a post signals interest and increases acceptance rates.
2. Pre-Outreach Warming — Like a prospect's recent post on Day 1, then send a cold email or connection request on Day 3. This multichannel touch builds familiarity.
3. CRM-Triggered Engagement — Connect your CRM to automatically like posts from high-value leads when they publish new content.
4. Content Monitoring — Use the GET reactions endpoint to monitor engagement on target posts and identify trending content for outreach timing.
5. Multi-Account Rotation — If you have multiple LinkedIn seats, distribute likes across accounts to maximize daily engagement capacity.
For full API documentation with code examples, visit the API Reference page at /docs/integrations.
LinkedIn templates serve as reusable building blocks for your outreach campaigns. Here is how they work and why they matter:
What Templates Do:
Templates are pre-written messages stored in your template library (LinkedIn > Templates).
They save time when creating multiple campaigns — instead of writing from scratch every time, select a proven template as your starting point.
Templates support merge tags ({{firstName}}, {{company}}, {{headline}}) so they auto-personalize for each prospect.
Why You Edit Messages in Campaigns:
When you create a campaign step and select a template, the template content is copied into the step as a starting point.
You can then customize the message for that specific campaign's audience without changing the original template.
This is by design — your template library contains your general frameworks, while each campaign step can be tailored to the specific audience.
Think of it like a document template in Word: you start from a template but customize each document.
Template Types:
Invite Note (300 character limit) — For connection request personalization.
Message (8,000 character limit) — For direct messages to connections.
InMail (8,000 character limit) — For InMail messages to non-connections.
Workflow:
Create templates in LinkedIn > Templates for your best-performing messages.
When building a campaign step, click the template picker to select one.
The template content fills the step editor — customize it for this specific campaign.
Changes to the step do NOT modify the original template (they are independent after selection).
For frequently used messages, save them as templates so you can reuse them across campaigns.
Auto-Created Templates: When you write a message directly in a campaign step without selecting from the library, the system may auto-create a template (marked with '(Auto)' suffix) for that step. These auto-templates are campaign-specific and update in-place, unlike library templates which are copy-on-write protected.
WarmySender supports connecting multiple LinkedIn accounts within the same workspace, each requiring its own LinkedIn seat. You can use all of them inside a single campaign so the work is shared automatically — no need to copy a campaign once per account.
How Multi-Account Works:
Each LinkedIn account = 1 LinkedIn seat ($15/month per seat, max 10 seats per workspace; seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price).
All accounts in the same workspace share prospects, audiences, and campaigns.
Each account is automatically detected as Free, Premium, Sales Navigator, or Recruiter based on its subscription.
Using Multiple LinkedIn Accounts in One Campaign (Step by Step):
Go to Campaigns > New Campaign.
Choose LinkedIn as the channel.
On the first step, you will see your connected LinkedIn accounts as a checklist. Tick every account you want to send from (or use 'Select All').
Once you select more than one account, a Rotation option appears. Choose Round Robin for an even, balanced split.
Finish building your steps (invite, follow-up message, and so on) and launch.
What Round Robin Does:
WarmySender splits your audience across the accounts you selected so that each lead is contacted by only ONE account — never by all of them at once.
This spreads the work evenly, so no single account is overloaded, and every account stays within its own safe daily and weekly limits.
A lead stays with the same account for the whole sequence — the account that sends the invite is the one that sends the follow-ups, so the conversation always comes from one consistent person.
Quick Example:
You connect 3 LinkedIn accounts and add 300 leads to one campaign with Round Robin.
WarmySender hands roughly 100 leads to each account.
Each lead gets the invite and follow-ups from a single account — never three invites from three accounts.
Each account works through its own ~100 leads at its own safe pace.
Availability:
Using multiple accounts in one campaign is included on every paid plan (Pro and up).
Each LinkedIn account you add needs its own $15/month seat.
Using Sales Navigator from a Different Account:
You can use one LinkedIn account with Sales Navigator for searching and a different account (or accounts) for sending.
Connect both accounts to your workspace (2 seats required).
Use the Sales Navigator account to run searches and build audiences (LinkedIn > Search).
Audiences are workspace-scoped, so any account in the workspace can use any audience when you build a campaign.
Account Type Detection:
Account type is auto-detected based on your LinkedIn subscription: Free, Premium, Sales Navigator, or Recruiter.
Each type has different search capabilities and daily limits.
Account capabilities are checked via LinkedIn > Accounts > each account shows its detected type.
Premium Cookie Setup:
For Sales Navigator or Recruiter features to work properly, you may need to provide a premium cookie (li_a) during account connection.
This is optional but recommended for full Sales Navigator search filter access.
Best Practices:
Use your Sales Navigator account exclusively for searches and audience building.
Use separate accounts for campaign sending to keep your Sales Navigator account safe.
Don't overload a single account — distribute campaigns across 2-3 accounts for safety.
Running several LinkedIn accounts on one campaign with Round Robin, and wondering why only one seems to be sending — or why the campaign paused itself? Both are usually working exactly as intended.
Why it looks like only one account is sending:
Round Robin splits your audience so each lead is contacted by only ONE account — never all of them at once. So your accounts work through DIFFERENT people rather than taking turns on the same person, and it's normal to see one account send while the others handle their own slice of the list.
A lead stays with the same account for the whole sequence — the account that sends the invite is the one that sends every follow-up, so the conversation always comes from one consistent person.
Accounts ramp at different speeds. A newer LinkedIn account eases in gently over its first few weeks and sends fewer actions per day than an established one, so it looks quieter for a while. This gentle ramp is what keeps a fresh account safe.
If only one account is actually ticked on the campaign, only that one will send — edit the campaign and tick the others.
Does adding accounts increase reach safely? Yes — that's the whole point. Each account you add brings its OWN safe daily allowance and gets its own slice of the audience, so your total daily reach goes up without pushing any single account harder than is safe. Example: connect 3 accounts and add 300 leads with Round Robin → WarmySender hands roughly 100 leads to each account, each lead gets the invite and follow-ups from a single account, and each account works its ~100 leads at its own safe pace. Adding more accounts is the safe way to reach more people per day — account safety always comes before speed.
Where to set up Round Robin:
Go to Campaigns > New Campaign (or open an existing campaign and choose Edit).
Choose LinkedIn as the channel.
Tick every account you want to send from (or use 'Select All').
Once you select more than one account, a Rotation option appears — choose Round Robin for an even, balanced split.
Finish your steps and save or launch. Each account needs its own LinkedIn seat.
How to change which accounts a running campaign uses: pause the campaign first, change the accounts, then resume. The pause-edit-resume step protects the conversations already in progress on each account, so nobody mid-sequence gets handed to a different account or contacted twice. 1) Open the campaign and click Pause. 2) Click Edit, go to the LinkedIn step, and tick or untick accounts. 3) Save your changes, then click Resume. Leads already assigned to an account stay with that account; leads that hadn't started are shared out across your updated set of accounts.
Why did my campaign pause itself? If a campaign pauses on its own after several actions in a row didn't go through, that's WarmySender protecting your account — not a glitch. Rather than keep retrying into a problem, the campaign steps back and waits for the cause to clear. In almost every case it's a LinkedIn account whose session has lapsed and needs a quick reconnect. • Your data is safe — no leads are lost and the campaign keeps its place. • It resumes and retries automatically once the cause is resolved. The most common fix is reconnecting the affected account under LinkedIn > Accounts (look for an account flagged as needing attention; you may be asked for a verification code). Once it's healthy again, the campaign picks back up on its own. • With multiple accounts, the others keep working — if only one account hits a problem, its slice of the leads waits for it to recover while your other accounts continue.
When to reach out: if a campaign stays paused after you've reconnected every account and confirmed they all show as connected, email [email protected] with the campaign name and we'll take a look.
WarmySender automatically protects each connected LinkedIn account with a dedicated proxy — ensuring your activity appears to originate from a consistent, geographically plausible IP address rather than a shared server.
Why Proxies Matter: LinkedIn monitors the IP addresses used to access accounts. If your account is accessed from a data center IP, or if multiple accounts share the same IP, LinkedIn may flag or restrict your account. WarmySender solves this by routing all LinkedIn activity through a fixed, dedicated proxy assigned to your account — so your traffic always appears consistent and natural.
Key Principles for Account Safety:
Consistency — The same IP is used every time (no rotation)
Geographic plausibility — Proxy is near your real location
Exclusivity — Your proxy is not shared with other accounts
How It Works:
When you connect a LinkedIn account, WarmySender assigns a dedicated fixed IP address to that account
All LinkedIn requests for that account are routed through the assigned proxy — never directly from WarmySender servers
The proxy IP is fixed (no rotation) and not shared with any other LinkedIn account
The proxy remains assigned for the lifetime of the connection, ensuring a consistent IP footprint
Proxy Modes: You configure your proxy during Step 2 of the LinkedIn account connection wizard. Three modes are available:
Auto (default) — WarmySender assigns a proxy automatically, geo-located near your detected IP. Best choice for most users — requires no configuration.
Country — You select a specific country for your proxy location. Useful if your LinkedIn account was originally registered from a different country, or if you operate across regions.
Custom — You provide your own proxy URL. Full control over your IP. Supports HTTP, HTTPS, and SOCKS5 protocols with optional username/password authentication.
Types of Proxies: Depending on the selected country and availability, WarmySender uses either ISP-grade (residential-quality) or datacenter proxies. The most important factors for account safety are consistency and geographic plausibility — not the specific proxy type. LinkedIn does not distinguish between ISP and datacenter proxies. Each account always gets a single dedicated IP regardless of type.
Supported Countries (Country Mode): 40+ countries are available. Countries with guaranteed availability include: • Americas: United States, Canada, Brazil • Europe: United Kingdom, Germany, France, Switzerland, Austria, Netherlands, Belgium, Italy, Spain, Portugal, Sweden, Norway, Denmark, Ireland • Asia-Pacific: Singapore, Japan, India, Australia • Middle East: United Arab Emirates
Additional countries may be available depending on current inventory. The full list is shown during account setup.
Custom Proxy Setup: If you select Custom mode, enter your proxy URL in this format: protocol://username:password@host:port
Supported protocols: http, https, socks5. If your proxy uses IP allowlisting instead of credentials, omit the username:password@ portion.
Frequently Asked Questions:
Q: Can I change my proxy after connecting an account? A: Proxy settings are configured during account connection. To change your proxy, disconnect and reconnect the account with new proxy settings. During reconnection, you can select a different proxy mode.
Q: Do all accounts share the same proxy? A: No. Every connected LinkedIn account gets its own dedicated IP address. Accounts are never co-mingled on the same proxy.
Q: Does proxy type (ISP vs datacenter) affect my account safety? A: Consistency and geo-plausibility matter far more than proxy type. A consistent datacenter IP near your real location is safer than a rotating residential IP from a different country.
Q: What if I don't choose a proxy mode? A: Auto mode is applied by default. WarmySender assigns the closest available proxy to your real IP location.
Q: Can I use a free public proxy? A: This is not recommended. Free proxies are often shared, unreliable, or already flagged by LinkedIn. Use a reputable paid proxy provider if choosing Custom mode.
Q: Does WarmySender rotate my IP? A: No. Each account gets a single fixed IP. IP rotation can look suspicious to LinkedIn — consistency is safer.
InMail lets you message LinkedIn members you are not connected with. Here is how to use it effectively.
What Is InMail? • InMail is a LinkedIn Premium/Sales Navigator feature that lets you message people outside your network. • You get a limited number of InMail credits per month (varies by subscription). • Credits are refunded if the recipient responds within 90 days.
When to Use InMail vs. Connection Request:
Use InMail for: Senior executives who rarely accept connection requests, time-sensitive outreach, when you have a highly relevant message.
Use Connection Requests for: Peers in your industry, people you share mutual connections with, building long-term relationships.
InMail response rates average 10-25% (vs. 20-40% for connection requests from well-optimized profiles).
Writing Effective InMails:
Subject Line (Critical):
Keep under 40 characters.
Personalize: '{{firstName}}, quick thought about {{company}}'
Edit your LinkedIn profile directly from WarmySender without leaving the platform.
Editable Fields: - Headline — Your professional title shown below your name (max 220 characters) - Summary/About — The About section on your profile (max 2,600 characters) - Open to Work — Toggle whether your profile shows the 'Open to Work' badge
How to Edit:
Go to LinkedIn > Accounts
Click on an account to open details
Click 'Edit Profile' at the bottom of the dialog
Update your headline, summary, or Open to Work status
Click 'Save'
Changes are applied directly to your LinkedIn profile via the API. They may take a few minutes to appear on LinkedIn.
Tip: A compelling headline increases connection acceptance rates. Consider updating it before launching outreach campaigns.
Manage your LinkedIn messages with delete, edit, and reaction capabilities.
Deleting Messages: You can delete messages you sent within the last 60 minutes. This is a LinkedIn platform limitation — after 60 minutes, deletion is no longer possible. 1) Open a conversation in LinkedIn > Conversations 2) Hover over a message you sent within the last hour 3) A trash icon appears — click it 4) Confirm the deletion in the dialog 5) The message is removed from both WarmySender and LinkedIn
Deleting Conversations: Entire conversations can be deleted from the conversation list. 1) Hover over a conversation in the list 2) Click the trash icon 3) Confirm deletion 4) The conversation is removed from both platforms
Message Reactions: Add emoji reactions to any message in a conversation. 1) Hover over a message 2) Click the smiley face icon 3) Choose from 6 emoji options 4) The reaction is sent to LinkedIn
Note: Message deletion is permanent and cannot be undone. The 60-minute window is enforced on both the client and server side for security.
The LinkedIn Analytics page now includes additional insights about your network and engagement activity.
Followers Section: View a list of your LinkedIn followers with their profile pictures, names, and headlines. Select an account to see its followers. Use 'Load More' for pagination.
Engagement History: Two side-by-side panels show your recent activity: - Recent Comments — Comments you've made on LinkedIn posts - Recent Reactions — Reactions (likes, celebrates, etc.) you've given
Account Health Actions: Two new maintenance actions are available for each LinkedIn account:
Resync Messages — Refreshes your messaging data from LinkedIn. Use this if messages appear out of sync or are missing. This is a lightweight operation.
Restart Connection — Reinitializes your LinkedIn connection. Use this as a last resort if your account is behaving unexpectedly. This is a heavier operation and requires confirmation.
These features appear at the bottom of the existing Analytics page — scroll down past the campaign performance and account health sections.
Recruiter Search Filters are an advanced set of search parameters available exclusively to users who have connected a LinkedIn Recruiter account to WarmySender. These filters go beyond the standard search options (keywords, location, industry, skills, schools) and let you pinpoint prospects based on tenure, employment type, education level, and result ordering. If your connected account is a Free, Premium, or Sales Navigator account, these filters will not appear — you will see an informational message explaining why.
Available Filters Explained
1) Tenure at Current Position (Min / Max Months) Specify the minimum and maximum number of months a prospect has held their current role. This is one of the most powerful filters for outreach because tenure correlates strongly with buying intent and openness to change. - Min Months: Only include prospects who have been in their current position for at least this many months. - Max Months: Only include prospects who have been in their current position for no more than this many months. - Example: Setting min=0 and max=6 finds people who recently started a new role — they are often evaluating new tools and vendors. - Example: Setting min=24 and max=120 finds people who have been in their role for 2-10 years — they likely have budget authority and established decision-making power.
2) Employment Type Filter prospects by their current employment arrangement. You can select one or more of the following: - Full-time — Target traditional full-time employees, ideal for enterprise sales. - Part-time — Reach part-time workers, useful for flexible staffing solutions. - Contract — Find contractors and consultants who may need tools or services for their engagements. - Internship — Target interns, useful for entry-level recruiting or educational products. Note: Some employment type options may require a Recruiter PRO subscription on LinkedIn's side.
3) Degree Include / Exclude Filter results based on the education level listed on prospects' LinkedIn profiles. - Include: Only show prospects who have one of the specified degree types (e.g., Bachelor's, Master's, MBA, PhD). - Exclude: Remove prospects who have a specific degree type from your results. - Important: Many LinkedIn profiles do not list education details. Using degree filters aggressively may exclude a large portion of otherwise qualified prospects. Use this filter as a refinement tool, not as your primary filter.
4) Sort By Control how your search results are ordered: - Relevance (default) — LinkedIn ranks results by how well they match your overall search criteria. - Alphabetical — Results sorted by prospect name, useful when scanning a large result set systematically. - Newest First — Surfaces profiles that were most recently updated or created, helping you find active LinkedIn users.
Use Cases
Scenario 1: Find Decision-Makers New in Their Role Set tenure min=0, max=6 months, combined with a senior job title keyword like 'VP' or 'Director' and your target industry. People who recently started a senior role are actively evaluating tools, renegotiating vendor contracts, and open to introductions. This is one of the highest-converting outreach segments.
Scenario 2: Target Contractors and Freelancers Select Employment Type = Contract. Combine with industry and skills filters to find independent consultants who may need your product or service for their client engagements. Contractors often have faster purchasing cycles since they make their own tool decisions.
Scenario 3: Exclude Entry-Level Prospects by Education If your product targets experienced professionals, use Degree Exclude to remove 'Internship' employment types and optionally exclude certain degree levels. This narrows your list to more experienced prospects without manually reviewing each profile.
Scenario 4: Find People with Budget Authority (2+ Years in Role) Set tenure min=24 months. Prospects who have been in their role for two or more years typically have established budgets, authority to approve purchases, and a clear understanding of their team's pain points. Combine with title keywords like 'Manager', 'Head of', or 'Director' for best results.
Step-by-Step Guide
Step 1: Select a Recruiter Account Go to LinkedIn > Campaigns or LinkedIn > Search. In the account selector dropdown, choose a connected LinkedIn account that has Recruiter-tier access. If you are unsure of your account type, check the LinkedIn > Accounts page where each account shows its tier.
Step 2: Open Advanced Recruiter Filters Below the standard search filters (keywords, location, industry, etc.), look for the 'Advanced Recruiter Filters' section. This section only appears when a Recruiter-tier account is selected. Click to expand it.
Step 3: Configure Each Filter - Tenure: Enter min and/or max months in the input fields. Leave blank to skip this filter. - Employment Type: Check one or more checkboxes (Full-time, Part-time, Contract, Internship). - Degree Include: Type degree names to add them to the include list. - Degree Exclude: Type degree names to add them to the exclude list. - Sort By: Select from the dropdown (Relevance, Alphabetical, Newest First).
Step 4: Run Your Search Click 'Search' to execute. All filters combine with AND logic — a prospect must match every active filter to appear in results. For example, if you set tenure min=6 AND employment type=Full-time AND industry=Technology, only full-time technology professionals who have been in their role for at least 6 months will appear.
Non-Recruiter Users
If your connected LinkedIn account is Free, Premium, or Sales Navigator tier, the Advanced Recruiter Filters section will not appear. Instead, you will see an informational message: 'Recruiter filters require a LinkedIn Recruiter account.' You can still use all standard search filters (keywords, location, industry, company size, skills, schools, job title, seniority, and more). To access Recruiter filters, you need to connect a LinkedIn account that has an active Recruiter or Recruiter Lite subscription and reconnect it through the LinkedIn > Accounts page.
Best Practices
Combine Tenure with Industry for Precision — Tenure alone returns a broad set. Adding an industry filter (e.g., 'SaaS', 'Financial Services') dramatically narrows results to relevant prospects.
Use Degree Filters Sparingly — A significant percentage of LinkedIn profiles have incomplete education sections. Over-relying on degree filters can exclude qualified prospects who simply haven't filled out their education. Use degree as a secondary refinement, not a primary filter.
Start Broad, Then Narrow Down — Begin with just one or two filters and review the result count. If you get too many results, add more filters incrementally. Starting too narrow risks missing good prospects.
Use Sort By Newest First for Active Profiles — Sorting by newest first helps you reach people who are actively updating their LinkedIn presence. These prospects are more likely to see and respond to your outreach.
Save Your Search Criteria — Once you find a filter combination that produces good results, note the settings so you can replicate them across campaigns. LinkedIn Recruiter also supports saved searches with a 'New Results Only' toggle to see fresh matches.
Respect Account Safety — Even with precise filters, always stay within WarmySender's daily action limits. Better targeting means fewer wasted actions, but never exceed the recommended daily outreach volume.
Frequently Asked Questions
Q: Which LinkedIn account types support Recruiter filters? A: Only LinkedIn Recruiter and Recruiter Lite accounts. Free, Premium Career, Premium Business, and Sales Navigator accounts do not have access to these filters.
Q: Can I save my Recruiter search and reuse it later? A: Yes. LinkedIn Recruiter supports saved searches. In WarmySender, you can reference a saved search by its ID and toggle 'New Results Only' to see only prospects added since your last search.
Q: Do Recruiter filters work with campaign auto-search? A: Yes. When you create a LinkedIn campaign with auto-search enabled, any Recruiter filters you configure will be applied each time the campaign searches for new prospects.
Q: What happens if I disconnect my Recruiter account? A: The Recruiter filter section will disappear and your searches will fall back to standard filters only. Any campaigns using Recruiter-specific filters will continue to run but will skip the Recruiter-only parameters.
Q: Can I combine Recruiter filters with the standard filters? A: Absolutely. Recruiter filters are additive. You can use keywords, location, industry, skills, company size, schools, seniority, and all other standard filters alongside the Recruiter-specific ones. All filters combine with AND logic.
Skill endorsements let you endorse a prospect's LinkedIn skills as a lightweight engagement action that builds rapport, triggers a notification on their end, and warms up the relationship before you send a connection request or message. This feature is available both as a campaign step and as a standalone action from any prospect's profile.
—— OVERVIEW ——
When you endorse someone's skill on LinkedIn, they receive a notification with your name and photo. This puts you on their radar without requiring them to accept anything. Unlike connection requests or InMails, endorsements are non-intrusive — the prospect sees your name, may visit your profile out of curiosity, and is more likely to accept a follow-up connection request from someone who already engaged with them. Studies show that prospects who receive an endorsement before a connection request accept at 2-3x the rate of cold invites.
How It Works Under the Hood: When the endorsement step executes, WarmySender fetches the prospect's full LinkedIn profile via our LinkedIn provider API, extracts all skills that have endorsement IDs, matches your preferred skill name (if you specified one), and submits the endorsement. The entire process is automated and takes a few seconds per prospect.
—— USE CASES ——
1) Warm Up Cold Prospects Before Connection Requests The most common use case. Place an 'Endorse Skill' step before your 'Send Invite' step in a campaign sequence. The prospect receives the endorsement notification, sees your name and profile photo, and when your connection request arrives 1-2 days later, you are no longer a complete stranger. This dramatically improves acceptance rates, especially for senior decision-makers who ignore cold invites.
2) Re-engage Dormant Leads Who Did Not Accept Your Invite If a prospect has not accepted your connection request after 7-14 days, an endorsement serves as a gentle nudge. It reminds them you exist without being pushy. Place it after a 'Wait Accept' timeout step in your campaign. Many prospects will revisit your pending invite after receiving the endorsement notification.
3) Build Social Proof Through Reciprocity People naturally want to return favors. When you endorse a prospect's skill, many will visit your profile and endorse one of your skills in return. This creates a mutual engagement loop. Even if they do not endorse back, the profile visit alone increases your visibility and makes future outreach warmer.
4) SDR Teams Using Endorsements as a First Touchpoint For sales development teams running high-volume outreach, endorsements provide a low-risk first touchpoint that does not consume your daily connection request quota. An SDR can endorse 15-20 prospects per day, then follow up with connection requests the next day — effectively doubling the touchpoints without doubling the risk.
—— STEP-BY-STEP CAMPAIGN SETUP ——
Adding Endorse Skill to a Campaign: 1) Go to LinkedIn > Campaigns and create a new campaign or edit an existing one 2) In the campaign editor, click 'Add Step' 3) From the Actions menu, select 'Endorse Skill' 4) Configure the step: • Preferred Skill (optional) — Enter a specific skill name like 'Python', 'Sales Strategy', or 'Product Management'. The system will try to match this against the prospect's listed skills. • If left blank, the system automatically endorses the first available skill on the prospect's profile. 5) Set an appropriate delay before this step (recommended: 0-1 days if it is the first step, or 1-2 days between steps) 6) Save your campaign
Best Placement — Before Send Invite (Cold Outreach): This is the recommended sequence for cold outreach campaigns: Step 1: View Profile (day 0) — Triggers a 'someone viewed your profile' notification Step 2: Wait 1 day Step 3: Endorse Skill (day 1) — Triggers a second notification with your name Step 4: Wait 1 day Step 5: Send Invite with personalized note (day 2) — They already recognize your name This three-touch warm-up sequence (view, endorse, invite) consistently outperforms single-step cold invites.
Alternative Placement — After Wait Accept Timeout (Re-engagement): Use this sequence when a prospect has not accepted your connection request: Step 1: Send Invite (day 0) Step 2: Wait Accept — timeout after 7 days Step 3: Endorse Skill (day 7) — Gentle nudge if invite was not accepted Step 4: Wait 3 days Step 5: Follow Up (if connected) or end campaign The endorsement after a timeout acts as a reminder without being aggressive.
Advanced Placement — Combined with Like/Comment: For high-value prospects, combine endorsements with other engagement actions: Step 1: View Profile (day 0) Step 2: Endorse Skill (day 1) Step 3: Like Post (day 2) — Like one of their recent posts Step 4: Send Invite (day 3) — By now they have seen your name 3 times This multi-touch approach works best for C-level executives and hard-to-reach prospects.
—— STANDALONE ENDORSEMENT GUIDE ——
You can also endorse skills outside of campaigns, directly from a prospect's profile:
Go to LinkedIn > Conversations or search for a prospect
Click on the prospect's name to open their profile details
Scroll to the 'Skills' section — you will see their listed LinkedIn skills
Click the 'Endorse' button next to the skill you want to endorse
The endorsement is submitted immediately and logged in the prospect's activity timeline
When to Use Standalone Endorsements:
Before sending a manual connection request or message
After a conversation goes cold — a subtle way to re-appear in their notifications
When researching a prospect and you want to leave a positive impression
To thank someone who engaged with your content or accepted your invite
—— BEST PRACTICES & GUIDELINES ——
Always endorse relevant skills — Match the skill to their industry and role. A CTO should be endorsed for 'Cloud Architecture' or 'Technical Leadership', not 'Microsoft Word'. Relevant endorsements show you actually looked at their profile.
Avoid generic skills — Do not endorse skills like 'Microsoft Office', 'Communication', or 'Teamwork'. These feel impersonal and spam-like. Choose skills that reflect their professional expertise and seniority.
Limit to 1 endorsement per prospect — Endorsing multiple skills on the same person looks automated and suspicious. One well-chosen skill endorsement is far more effective than three generic ones.
Space endorsements throughout the day — Do not endorse 15 prospects in 5 minutes. WarmySender automatically spaces actions throughout your sending window, but if using standalone endorsements manually, wait at least 5-10 minutes between each.
Combine with profile view for better warm-up — A profile view followed by a skill endorsement (with a 1-day gap) creates a natural-looking engagement pattern. The prospect sees 'Someone viewed your profile' and then 'Someone endorsed your skill' — this feels organic, not automated.
Use the preferred skill field strategically — If you are targeting a specific industry (e.g., SaaS sales leaders), set the preferred skill to something common in that niche like 'SaaS Sales' or 'Sales Strategy'. This ensures every endorsement in the campaign feels relevant.
Review endorsement results — Check the campaign step analytics to see how many endorsements were successfully delivered vs. skipped. A high skip rate means your target audience does not list many skills, and you may want to adjust your approach.
—— RATE LIMITS & SAFETY ——
Endorsements share the daily engagement limit with post likes and comments. Here is the ramp-up schedule:
Days 1-3 (New Account): Max 5 endorsements per day
Days 4-7 (Warming Up): Max 10 endorsements per day
Days 8-14 (Established): Max 15 endorsements per day
Days 15+ (Fully Ramped): Max 20 endorsements per day
These conservative limits protect your LinkedIn account from being flagged for unusual activity. The system automatically tracks your daily usage and will defer remaining endorsements to the next day if you hit the limit.
What Happens at the Limit:
The endorsement step is paused and queued for the next available day
The enrollment is NOT failed — it simply waits
You receive a notification in the campaign dashboard showing 'Rate limited — will retry tomorrow'
Other step types (messages, invites) are not affected by the endorsement limit
Account Safety Notes:
Endorsements are one of the lowest-risk LinkedIn actions — they rarely trigger account restrictions
However, endorsing dozens of people you have no connection to in rapid succession can look suspicious
WarmySender adds randomized delays (30-120 seconds) between endorsement actions to mimic human behavior
If your LinkedIn account is in a restricted state, all actions including endorsements are automatically paused
—— TROUBLESHOOTING ——
• No Skills Found on Prospect's Profile Some LinkedIn users do not have any skills listed, or their skills section is hidden. When this happens, the endorsement step is automatically skipped and the enrollment advances to the next step. The campaign does not fail. You will see 'Skipped — no endorsable skills found' in the step log. This is normal and affects roughly 10-15% of prospects.
• Endorsement Failed with an Error If the endorsement API call fails (e.g., due to a temporary LinkedIn outage or API rate limit), the system retries up to 2 times with a 5-minute delay between attempts. If all retries fail, the step is marked as 'Failed' but the enrollment continues to the next step. Check the error message in the campaign logs for details.
• Preferred Skill Name Not Matching The skill matching is case-insensitive and uses partial matching. If you specify 'Python' as the preferred skill, it will match 'Python', 'Python Programming', or 'Python Development'. However, if the prospect does not have any skill containing your keyword, the system falls back to endorsing the first available skill. To avoid mismatches, use broad skill keywords rather than very specific ones.
• Endorsement Succeeded but Prospect Did Not Get Notified LinkedIn controls notification delivery. In rare cases, the prospect may have notifications turned off for endorsements, or LinkedIn may batch the notification into a digest email. The endorsement still appears on their profile and is visible to them when they view their skills section.
• Duplicate Endorsement Warning If you have already endorsed a prospect's skill (from a previous campaign or manual action), the system detects this and skips the step to avoid sending a duplicate. This is logged as 'Skipped — already endorsed' in the step log.
—— FREQUENTLY ASKED QUESTIONS ——
1) Can I endorse someone I am not connected with? Yes. LinkedIn allows you to endorse skills on anyone's public profile, even if you are not connected. This is what makes endorsements such an effective pre-connection warm-up action.
2) Will the prospect know I used an automation tool? No. The endorsement appears exactly the same as a manual endorsement. LinkedIn shows your name and profile photo in the notification. There is no indication that it was sent via an API or automation tool.
3) Can I undo an endorsement after it is sent? Endorsements can be manually removed from LinkedIn's web interface, but WarmySender does not provide an undo feature. This is why it is important to endorse relevant skills — you want the endorsement to reflect well on you if the prospect views it.
4) Should I endorse prospects who are already connected with me? Generally no, unless you are using it as a re-engagement tactic for dormant connections. For active connections, direct messaging is more effective. Endorsements are most powerful as a pre-connection or re-engagement tool.
5) How do endorsements interact with other campaign steps? Endorsements are independent of other step types. They do not consume your connection request or message quotas. They share the engagement limit with likes and comments only. You can safely combine endorsement steps with any other step type in the same campaign without worrying about quota conflicts.
Proxy management lets you change the IP address used for your LinkedIn connection, improving account safety by matching your IP location to your LinkedIn profile's location.
Three Proxy Modes:
Auto — WarmySender automatically assigns a proxy that matches your account's location. Best for most users.
Country — Select a specific country from 22 available options. WarmySender uses a managed proxy in that country. Use this when your LinkedIn profile says you're in a specific country.
Custom — Enter your own proxy URL in the format: http://username:password@host:port. Supports HTTP, HTTPS, and SOCKS5 protocols. Use this if you have dedicated proxies.
How to Change Proxy:
Go to LinkedIn > Accounts
Click on an account to open details
Click 'Change Proxy' next to the current proxy display
Select your preferred mode and configure it
Click 'Save'
Important: Pause all active campaigns before changing your proxy. Switching proxies while campaigns are running may trigger LinkedIn's security systems. After changing the proxy, wait a few minutes before resuming campaigns.
WarmySender's 4 pillars — cold emailing, email warmup, LinkedIn outreach, and multichannel — all respect a campaign's sending window. This guide explains how the LinkedIn sending window works, why a small subset of LinkedIn campaigns occasionally queued sends outside the chosen hours before April 27, 2026, and how that issue is now resolved.
What the sending window is: Every campaign has four schedule controls: • Start hour — the earliest time of day (in your campaign's timezone) when sends are allowed (e.g., 9 AM) • End hour — the latest time of day when sends are allowed (e.g., 5 PM) • Schedule days — which days of the week sending is allowed (e.g., Mon/Tue/Wed/Thu/Fri) • Timezone — the IANA timezone (e.g., Asia/Kolkata, Europe/London, America/New_York) used to interpret the start/end hours
For example, a campaign set to 'Mon-Fri 9 AM to 5 PM Asia/Kolkata' will only send between 9 and 5 IST on weekdays. Outside those hours, the scheduler holds the job and clamps it forward to the next valid moment within the window.
Why sending only inside the window matters: LinkedIn's automation-detection systems weigh many signals. One of them is the time-of-day pattern of your account's activity. The published guidance from our LinkedIn integration partner is that invitations and messages should be distributed across working days at random intervals — and 'working days' is understood to mean normal business hours. A connection request that fires at 4 AM looks unmistakably automated, even if the daily/weekly cap is respected. Sending strictly inside the user-configured window is therefore not just a UX preference — it is part of staying invisible to LinkedIn's automation detection.
The issue we found and fixed on April 27, 2026: WarmySender's scheduler runs both email and LinkedIn jobs through a single unified engine. The email branch of that engine has always re-aligned any send whose computed time falls outside your window. The LinkedIn branch was supposed to call the same function. Due to a copy-paste omission when the unified engine was first built, the LinkedIn branch only enforced the day-of-week (e.g., 'don't send on Saturday') but skipped the hour-clamp ('don't send before 9 AM or after 5 PM').
The practical impact: In the seven days leading up to the fix, roughly 134 LinkedIn jobs across the entire platform (about 0.6% of total LinkedIn jobs) queued at hours outside their campaign's chosen window. Most of these were a few hours off — a 5 PM cutoff that became a 6 PM send, or a 9 AM start that was nudged back to 8 AM by random jitter. The legacy LinkedIn-only scheduler enforced the window correctly, so older campaigns were unaffected. Campaigns sending within strict, narrow windows (e.g., London 10 AM-4 PM) were affected the most.
The fix: The LinkedIn branch of the scheduler now applies that same re-alignment immediately before every send is queued, identical to the email branch. We added a regression test that asserts every queued LinkedIn job's run-time falls within the campaign's window. No backfill is needed — historical sends already happened — but every send going forward will be inside your chosen hours.
How to verify your campaign respects your window:
Open your campaign in the LinkedIn dashboard.
Look at the schedule pill on the campaign card — it shows your active days and window in your timezone (e.g., 'Mon Tue Wed Thu Fri 9-17 IST').
Look at the 'next scheduled send' indicator on the campaign card. It should always show a time inside your window.
If you want to spot-check historical sends, open the campaign analytics tab and review the timestamps in the recent activity log.
What to do if you notice a send outside your window: It is very unlikely after April 27 — the regression test runs on every deploy. But if you do notice an out-of-window send, please email [email protected] with the campaign name, the date and time of the send, and the configured window. We will investigate the specific row.
Account safety always wins: Clamping a send forward into the window can never accelerate it. The scheduler only ever defers a job, never advances it past its earliest legal time. So this fix slightly reduces total daily volume on the affected campaigns; nothing about it increases LinkedIn API call volume. That is consistent with WarmySender's account-safety-first philosophy: every change must either reduce risk or keep it constant.
For the full LinkedIn safety model — invites, messages, InMails, profile views, ramp curves, and per-account caps — see the 'How LinkedIn account safety limits work' guide below.
WarmySender emits real-time webhook events for LinkedIn reply, invite acceptance, message sent, and account disconnect activity. This guide is the canonical reference for how the events flow, where to subscribe, how Slack and Discord messages are formatted, the n8n / generic JSON shape, how to test, how to troubleshoot, and why the webhook layer never affects LinkedIn account safety.
Supported events:
Four `linkedin.*` events are emitted today. All share the same envelope `{ event, id, occurredAt, workspaceId, data }` with HMAC-SHA256 signature on the body and a unique `X-Warmy-Event-Id` header for idempotency.
`linkedin.reply_received` — the prospect replied to a campaign message or InMail. Fired ONCE per enrollment on the first reply (subsequent messages on the same thread do not re-fire). Data fields: `campaignId`, `enrollmentId`, `prospectId`, `prospectName`, `prospectLinkedinUrl`, `linkedinAccountId`, `messageText` (the reply body, full length), `threadId`, `receivedAt`.
`linkedin.invite_accepted` — the prospect accepted a connection request. Fired ONCE per enrollment on the first acceptance (our LinkedIn provider webhook retries do not duplicate). Data fields: `campaignId`, `enrollmentId`, `prospectId`, `prospectName`, `prospectLinkedinUrl`, `linkedinAccountId`, `acceptedAt`.
`linkedin.message_sent` — a campaign message or InMail successfully delivered (fired only after LinkedIn confirms delivery and your counters are updated). Useful for CRM activity logging. Fired once per send, NOT once per step. Data fields: `campaignId`, `enrollmentId`, `prospectId`, `linkedinAccountId`, `messageType` ('message' | 'inmail'), `sentAt`.
`linkedin.account_disconnected` — the LinkedIn account auto-paused because our LinkedIn provider cookie expired or LinkedIn restricted the account. Useful for ops alerting. Data fields: `linkedinAccountId`, `accountName`, `disconnectedBy` ('user' | 'system' | 'linkedin'), `disconnectedAt`, `pausedCampaignIds` (array).
Open Settings → Webhooks (`/settings?tab=webhooks`).
Click 'New Webhook'. Paste your endpoint URL — Slack Incoming Webhook URL (https://hooks.slack.com/...), Discord Webhook URL (https://discord.com/api/webhooks/...), n8n / Make / Zapier HTTP Trigger URL, or your own HTTPS endpoint.
Pick events. For sales teams, the typical set is `linkedin.reply_received` + `linkedin.invite_accepted`. For ops, add `linkedin.account_disconnected`. Subscribe to `*` for everything.
Save. WarmySender returns a webhook secret — save it once (shown only on creation). Used for HMAC verification on your endpoint.
Click the new 'Test webhook' button on the webhook row. We fire a sample `linkedin.reply_received` payload to your URL through the real delivery path. Recent Deliveries shows the result.
The row now shows a 'Last fired' timestamp (`last_triggered_at`) updated on every successful delivery — useful for debugging silence (if it stops updating, the upstream signal is missing or the formatter is failing).
How Slack messages are formatted:
WarmySender auto-detects Slack Incoming Webhook URLs (host = `hooks.slack.com`) and formats events as Block Kit messages — no Zapier / Make / n8n middleware needed.
A `linkedin.reply_received` event arrives in Slack as a card with: - Header: 'New LinkedIn reply' with the WarmySender icon - Section block: prospect name (linked to LinkedIn profile) + campaign name (linked to campaign detail in WarmySender) + LinkedIn account that received the reply - Quoted block: the reply body (truncated to ~400 chars for readability; full body is in the JSON payload if you also subscribe via a generic endpoint) - Action buttons: 'Open in WarmySender' and 'View on LinkedIn' (deep links) - Context block: receivedAt timestamp in your workspace timezone
A `linkedin.invite_accepted` event arrives as: - Header: 'New connection accepted' - Section: prospect name (linked) + campaign name (linked) + 'Accepted at HH:MM YYYY-MM-DD' in workspace TZ - Action button: 'Send a message'
Formatting is server-side — Slack receives a JSON Block Kit body, NOT raw event JSON. If you point a non-Slack endpoint at a Slack URL by mistake, the formatter still runs because we route on URL host.
Discord support:
As of April 2026, Discord webhook URLs (host = `discord.com` / `discordapp.com`) are auto-detected and formatted as `{ content, embeds }` payloads. Each event becomes an embed with title, description (the reply body or 'X accepted Y's connection request'), color (blue for replies, green for acceptances, red for account_disconnected), and a pair of links in the description.
Before the formatter shipped, Discord webhook URLs received the raw JSON envelope and returned 400 Bad Request ('Cannot send an empty message') because Discord requires `content` or `embeds` at minimum. Old deliveries that hit that path are now in the dead-letter queue and are NOT auto-replayed (replay would fire stale notifications). If you need a backfill, contact support with the affected URL and date range.
Example Discord embed (linkedin.reply_received):
{ "content": null, "embeds": [{ "title": "New LinkedIn reply: Zoltan A. Vardy", "description": "\"Sounds good, send me the deck.\"\n\n[View in WarmySender](...) · [View on LinkedIn](...)", "color": 3447003, "timestamp": "2026-04-28T09:34:14.000Z", "footer": {"text": "Campaign: April Outreach · LinkedIn account: [email protected]"} }] }
n8n / generic:
Any URL that isn't recognized as Slack or Discord receives the raw signed JSON envelope. This includes n8n HTTP Trigger URLs, Make custom webhook URLs, Zapier Catch Hook URLs, AWS Lambda function URLs, and your own HTTPS endpoints.
Recommended n8n HTTP Trigger config: - Authentication: None (rely on HMAC verification — see the 'Webhooks — Getting Started' guide for the Node.js verification snippet). - Method: POST - Response Mode: Respond with response code 200 immediately, then process asynchronously (don't make WarmySender wait for downstream HubSpot / Slack calls — our retry timeout is 5 seconds). - Body: keep as JSON. The payload is `{ event, id, occurredAt, workspaceId, data }`. - Headers to capture: `X-Warmy-Event-Id` (idempotency key, store ~24 h), `X-Warmy-Signature` (parse `t=<unix_ms>,v1=<hmac_hex>`), `X-Warmy-Event-Type` (event name).
For Make / Zapier, the payload shape is identical; switch on `{{$json.event}}` to branch.
Testing your webhook:
On the webhook row in Settings → Webhooks, click the 'Test' button. We POST a sample `linkedin.reply_received` payload to your URL via the real delivery path (same signature, same retries, same dead-letter handling).
Check 'Recent Deliveries' on the same page — you'll see the response code and body within ~10 seconds.
If 2xx: your endpoint accepted the test; you should see the message in Slack / Discord / your n8n flow.
If 4xx: signature verification or formatting on your side rejected the payload; check the response body in Recent Deliveries for the error message.
If 5xx: your endpoint had a server error; we'll retry up to 10 times with exponential backoff (1 min → 72 h).
For real LinkedIn replies (not just the test button), the easiest end-to-end test is to reply to yourself from a second LinkedIn account or have a teammate reply.
Troubleshooting:
**'last_triggered_at' is not updating, but I know replies are coming in.** Two things to check. First, is the upstream signal arriving? Open Inbox → LinkedIn tab and confirm the reply is visible there. If yes, the inbound side is fine and the issue is in webhook emission — check Recent Deliveries for a 4xx/5xx, or contact support. Second, if the inbound side itself is empty, the issue is upstream of webhooks (our LinkedIn provider cookie, account disconnected) and the webhook layer is correctly silent.
**Slack message arrives malformed (raw JSON instead of Block Kit).** Confirm the URL host is `hooks.slack.com`. URLs from `slack.com` or custom Slack domains are not auto-detected and fall through to the generic JSON path. Recreate the webhook with the canonical Incoming Webhook URL.
**Discord 'Cannot send an empty message' (400).** This was the pre-April 2026 bug. The Discord formatter now handles this. If you still see 400s after April 28, 2026, check Recent Deliveries for the actual response body — it may be a content-length mismatch on a Discord-hosted CDN attachment, which is unrelated to our formatter.
**Events array is missing on `linkedin.reply_received` / `linkedin.invite_accepted`.** Confirm the webhook is subscribed to the specific event. A webhook subscribed only to `*` (wildcard) will receive ALL events; one subscribed only to `linkedin.invite_accepted` will NOT receive replies. Check the webhook row's events list in Settings → Webhooks.
**Signature mismatch (401 from your endpoint).** You're hashing the parsed-then-reserialized JSON, not the raw body. Capture `req.rawBody` BEFORE `express.json()` (or equivalent middleware). Also confirm you're using the webhook secret, NOT the API key. Full Node.js snippet in the 'Webhooks — Getting Started' guide.
**Replies stopped firing entirely (platform-wide silence).** As of April 28, 2026 we run a cron monitor that compares inbound LinkedIn message volume against `linkedin.reply_received` emit volume every 3 hours; a >50% gap fires an internal alert. If you see a multi-day silence, contact support with the affected workspace ID and the date range.
Account safety note (CRITICAL):
Webhooks are read-side only. Receiving a webhook never triggers a LinkedIn API call. The emission path is: we record the reply or acceptance in our own database (exactly once, even if the same signal arrives twice) → we queue a webhook event → the deliverer pushes it to your URL. No path from a webhook arrival back to our LinkedIn provider. Subscribing to webhooks does not change polling cadence, daily caps, weekly caps, ramp pacing, or any LinkedIn action volume on your account. Every LinkedIn API call is driven by your campaign sends / invites / profile views, not by webhook activity. Account safety always wins over throughput, and webhooks live entirely on the safe side of that line.
For full HMAC signature verification, idempotency, retry schedule, and the rest of the cross-channel webhook reference (email events too), see the 'Webhooks — Getting Started' guide.
WarmySender automates the full outreach stack — cold emailing, email warmup, LinkedIn outreach, and multichannel sequences. On the LinkedIn side, account safety always wins over speed. A banned LinkedIn account is unrecoverable, so every cap below is set conservatively and is enforced by the scheduler regardless of how aggressively a campaign is configured. This guide explains the four cap dimensions, how they are computed, the four account types, the four ramp strategies, and the new dedicated InMail cap shipped on April 27, 2026.
The four cap dimensions WarmySender enforces per LinkedIn account:
Invites per week — How many connection requests the account can send in a rolling LinkedIn week. LinkedIn's own caps are 100-200 per week depending on tier. WarmySender stays at or below this ceiling.
Messages per day — How many direct messages to existing 1st-degree connections the account can send per day.
InMails per day (NEW April 27, 2026) — How many InMail messages to people who are NOT 1st-degree connections the account can send per day. Before April 27 this shared the messages-per-day bucket, which allowed up to 100 InMails per day on a Sales Navigator account — well above our LinkedIn provider's recommended safe band of 30-50 per day. Now there is a dedicated cap, so InMails and regular messages are tracked and limited independently.
Profile views per day and engagements per day — How many profile views and how many post likes/comments/endorsements the account can make per day. These have always been capped per ramp week; no change in April 2026.
How the daily/weekly cap is computed: For each cap dimension, the effective limit is the MINIMUM of two values: • Account-type cap — A ceiling determined by your LinkedIn subscription tier (Free / Premium / Sales Navigator / Recruiter) • Strategy cap — A ramp-week-aware value determined by your account's ramp strategy (new_account / established / veteran / recovery)
The stricter of the two always wins. So a brand-new Recruiter account is held to the new_account ramp limits, not the Recruiter tier ceiling, until it has aged enough to graduate to a faster strategy.
The four ramp strategies (and what they mean):
new_account — 6-week ramp. Default for any account that is brand-new in WarmySender or that has no prior usage history. The most conservative strategy. Daily limits start at roughly 25-30% of full capacity in week 1 and reach full capacity around week 5-6.
established — 4-week ramp. Auto-applied to accounts that have been running clean in WarmySender for 30+ days. Faster ramp because we already have engagement data showing the account behaves naturally.
veteran — 2-week ramp. Auto-applied to accounts that have been running clean for 60+ days with no restrictions. Reaches full capacity within 2 weeks because the account has demonstrated it can handle higher volume.
recovery — 8-week ramp at half-speed. Auto-applied after any account restriction or ban event. The slowest, most conservative ramp. Designed to slowly rebuild trust with LinkedIn after a flagged event.
The four account types (and their ceilings):
Free — Standard LinkedIn. Cap: ~150 invites/week. InMails: not allowed (LinkedIn restricts InMail to paid tiers). Free accounts hit weekly caps fastest, especially with personalized invite notes.
The new InMail ramp curve in plain English (April 27, 2026):
If you connect a brand-new Sales Navigator account, you will start at 25 InMails per day in week 1. By week 2 you reach 40 InMails per day, which is the full capacity for a Sales Navigator veteran account. Premium accounts cap at 15 InMails per day even at full ramp. Free accounts cannot send InMails at all because LinkedIn restricts that feature to paid tiers.
The full ramp table (per strategy) for InMails per day:
new_account week 1-2: 15 per day
new_account week 3+: 25 per day
established: 35 per day
veteran: 40 per day (the center of our LinkedIn provider's safe 30-50 band)
recovery: 10 per day
These values are then capped by the account-type ceiling above. So a brand-new Sales Navigator account is held at 25/day in week 3 (strategy cap), even though Sales Navigator's account-type ceiling is 50/day. A veteran Premium account is held at 15/day (account-type cap), even though the veteran strategy would allow 40/day.
Why we ramp gradually (the most important paragraph):
WarmySender connects to LinkedIn through a specialist integration partner. Their published safe daily band for InMails is 30-50 per day across all paid tiers. Going faster than that — even on a Recruiter account that LinkedIn technically allows up to 100/day — significantly increases the chance that LinkedIn flags your account for unusual activity and applies a temporary restriction. A restriction can range from a 'verify your identity' challenge (24-48 hour resolution) to a permanent account loss. WarmySender's default of 40/day for a Sales Navigator veteran sits comfortably in the middle of our LinkedIn provider's safe band, and the 2-week ramp from 25 to 40 mirrors the natural growth pattern of a real human user.
How to override (custom override field in account settings):
If you have legitimate operational need to push higher than the default — for example, a Recruiter account with a documented LinkedIn-Recruiter contract allowing 100/day — you can set a custom override per account. The fields are:
customMaxInvitesPerWeek
customMaxMessagesPerDay
customMaxInmailsPerDay (new April 27, 2026)
customRampWeeks (override the strategy ramp length)
These fields are validated on our side: the override cannot exceed the published safe ceiling (e.g., InMails cannot be set above 50/day even with an override, regardless of LinkedIn's stated upper bound). The override must be set explicitly per account from the LinkedIn Account settings page, and changing it requires acknowledging the risk warning. We deliberately do NOT expose a 'turn off all safety limits' option, because that would put your account in the high-risk band without recourse.
How to check your current limits:
Go to LinkedIn > Accounts in the sidebar.
Click into a specific account.
The account detail panel shows: account type pill (Free / Premium / Sales Navigator / Recruiter), current strategy (new_account / established / veteran / recovery), current ramp week (e.g., 'Week 3 of 6'), and the four effective daily/weekly caps for invites, messages, InMails, profile views, and engagements.
Below that, you can see today's running counts toward each cap (e.g., 'Invites this week: 47/200 — 30% of cap'). When a cap is reached, the next scheduler tick stops queuing that action type until the cap window resets.
What happens when a cap is reached:
The scheduler does not 'overflow' or 'burst' to catch up. Each campaign sharing the account simply waits until the cap resets — daily caps reset at 00:00 UTC, weekly caps roll on Monday 00:00 UTC. Prospects in flight do not lose their place in the sequence. They wait at their current step until the next legal sending opportunity. This is consistent with the 'never bulk-replay missed sends after an outage' principle: bursting is the single most reliable way to trigger LinkedIn restrictions, so we always pace at the configured rate, not a catch-up rate.
What happens if user config conflicts with safety limits:
If a campaign is set to 'send 100 invites per day' but the per-account cap is 40, the campaign will execute 40 invites per day until the prospect pool is exhausted or the account graduates to a higher cap. The campaign does NOT fail, and prospects do NOT silently disappear — they wait. This is the 'account safety always wins' rule from CLAUDE.md: when user intent conflicts with safety, safety wins and the step waits or defers.
Summary table of full-ramp caps (after the strategy ramp completes):
The strategy cap is then applied on top — for example, a Sales Navigator veteran account hits 40 InMails/day even though the account-type ceiling is 50/day, because the veteran strategy caps at 40 (the center of the published safe band).
For the related sending-window enforcement fix shipped the same day, see the 'Why my LinkedIn campaign sometimes sends outside my chosen hours' guide above.
When WarmySender sends a LinkedIn InMail on your behalf, every successful send is verified against our LinkedIn provider's response before any counter or dashboard tile is incremented. This guide explains how that verification works and what you should expect to see on the dashboard.
How it works
LinkedIn InMail is an off-network message that goes through the recipient's LinkedIn inbox even if you're not connected. WarmySender drives LinkedIn actions through a specialist integration partner, and creating an InMail goes through them. On a real send, LinkedIn hands back a conversation ID — the unique identifier of the InMail thread on LinkedIn's side. WarmySender treats the presence of that conversation ID as proof of delivery: no conversation ID means the InMail did not actually queue on LinkedIn, even if the send request itself came back looking successful.
This matters because LinkedIn rejects InMail sends for several legitimate reasons: the recipient might not be eligible (no Open Profile, no Sales Navigator credits, account paused), the daily / weekly cap might be reached, the network might have hiccupped, or the underlying LinkedIn session might need a refresh. In any of these cases, the send request can come back looking successful while the InMail itself was silently dropped. WarmySender's contract with you is that the dashboard counter and the per-account InMails-Sent-Today tile only advance when the conversation ID proves the message landed.
What you'll see on the dashboard
- InMails Sent — Counts only verified sends. If you see this counter at zero while your campaign is active, it means we attempted the send but LinkedIn never confirmed a conversation. Check the Account → Health tile for cap exhaustion or eligibility issues, and check the campaign's most-recent skipped events for the specific reason. - InMail Replies — Counts only inbound messages on a verified thread. Reply rate is computed against verified sends, not attempted sends — your reply % is honest.
What to do if your InMail count looks lower than expected
1. Check the campaign's per-prospect skipped events. If many say the InMail was never confirmed, the underlying account or eligibility check is failing — review your LinkedIn account's Sales Navigator subscription status, InMail credits remaining, and the recipient's Open Profile flag (if applicable). 2. Check your account's daily InMail cap on the LinkedIn Accounts page. WarmySender ramps InMail caps over the first 4 weeks in line with our integration partner's account-safety guidance. 3. If counts look right but your delivery rate is unusual, contact support — we'll pull the delivery trail for your account and confirm what LinkedIn returned on each attempt.
Why we don't count phantom sends
A platform that counts every attempted send, confirmed or not, as a successful send produces an inflated dashboard, an incorrect cost-per-reply ratio, and a false sense of throughput. Worse, when a customer pays for Sales Navigator credits, they're entitled to know which credits were actually consumed and which were silently dropped. We treat InMail sends like financial transactions: no confirmed conversation, no count.
If you log in and find a campaign in a paused state you didn't trigger yourself, here's how WarmySender's auto-pause works, why it does what it does, and what to expect during recovery.
When WarmySender auto-pauses a campaign
Auto-pause is a safety mechanism, not a fault state. The platform pauses a campaign when continuing to send would put your LinkedIn account at risk or when the campaign cannot make progress. Specifically:
- Your LinkedIn account disconnected (our LinkedIn provider detected that LinkedIn rotated your session token, your password changed, you triggered a 2FA prompt, or your IP region changed). LinkedIn rotates session tokens on a roughly 30-day rhythm; this is normal. - A high-failure-rate window was detected. If invites or messages keep getting rejected, we pause to investigate before continuing — sustained failure rates are a strong ban-risk signal on LinkedIn. - The account was restricted by LinkedIn (warning, jail, or partial restriction). Continuing to send during a restriction would likely escalate it. - The subscription on the workspace lapsed. We hold campaign state but don't send.
What the dashboard shows
Every paused campaign shows a reason chip on the campaign detail page. Hover over it for the full explanation. If you ever see a paused campaign without a reason chip, that's a bug — a safety rule in our database rejects any pause that doesn't carry a reason — so if you encounter one, please email support and we'll investigate.
Reasons you might see (and what each means): - LinkedIn account disconnected — Your LinkedIn account was disconnected. Click Reconnect on the LinkedIn Accounts page; the campaign will auto-resume within ~5 minutes. - High failure rate — Too many sends failed in a recent window. We pause to protect the account; once the underlying cause is fixed (e.g., a template typo, a Sales Nav credit refill, an Open Profile mismatch), click Resume. - Account restricted — LinkedIn restricted the account. DO NOT immediately resume; wait until the LinkedIn restriction lifts and contact support before resuming so we can verify the account is healthy. - Subscription lapsed — The workspace subscription lapsed. Settling the invoice is the only thing that clears this one; the campaign resumes on its own within about a minute afterwards. - Paused manually — You (or another workspace member) clicked Pause. Resume when ready.
What happens to your prospects during a pause
Paused campaigns hold all per-prospect state in place. Prospects that were scheduled for tomorrow will still be scheduled for tomorrow when you resume; the scheduler doesn't burst-send a backlog the moment Resume is clicked. Specifically:
- Prospects with a future next-action timestamp that fell during the pause window get moved forward to the next valid sending window using the campaign's active days, sending window, timezone, and time-randomisation settings. - Prospects already accepted are not re-invited. - Pending invites are tracked on our LinkedIn provider's side and detected automatically when the recipient accepts.
Multichannel campaigns and email sends
If you have a multichannel campaign (email + LinkedIn) and your LinkedIn account disconnects, the campaign now correctly continues sending email steps for prospects whose current step is an email step. Earlier versions of the platform paused all multichannel campaigns when any linked LinkedIn account disconnected — we now check whether any active step in the campaign actually uses LinkedIn, so if none do, the disconnect won't pause it.
Manual recovery
If a campaign is paused and the underlying issue is resolved, click Resume on the campaign detail page. Resume re-checks every safety gate (account health, daily/weekly cap, ramp schedule, subscription status). If Resume can't proceed, the page tells you the specific reason inline.
Why we don't auto-resume after a manual pause
If you paused a campaign manually, we don't know whether you wanted to pause it for an hour or for a quarter. Manual pause stays paused until you click Resume. The auto-resume sweepers only restart pauses we explicitly know are recoverable — a disconnected LinkedIn account once it reconnects, and a high failure rate once the failure rate normalizes.
Workspaces on Enterprise and Ultimate plans can have multiple LinkedIn accounts connected at once — typically one account per sales rep, all in the same workspace. WarmySender handles a few subtle invariants for those workspaces, especially around acceptance webhooks.
Why this matters
When LinkedIn fires a 'connection accepted' event for one of your reps, our LinkedIn provider may deliver the event on a sibling LinkedIn account in the same workspace tenant rather than the originating account. This isn't a bug on our LinkedIn provider's side — it's how their tenant-wide webhook fan-out works. The platform handles this by scoping the acceptance lookup to the workspace, not just the receiving account, so the right prospect is stamped regardless of which sibling account received the webhook.
What you'll see on the dashboard
- Acceptance events are stamped on the prospect's enrollment in the campaign that owns the prospect, not on whichever account happened to receive the webhook. - Slack / n8n / Zapier notifications fire once per acceptance, and the source path (webhook, polling, sales navigator decode, engine-already-connected) is included in the payload for traceability. - The dashboard accept counter reads directly from the prospect's recorded acceptance time — no separate cache, no double-counting.
What happens if two sibling accounts have the same prospect
WarmySender's bridging logic abort-and-traces if a single acceptance event matches prospects spanning multiple LinkedIn accounts in the same workspace — that situation is rare (we monitor for zero rows in this shape platform-wide) but the defensive guard prevents stamping the wrong prospect. If it ever fires, an admin alert surfaces the conflicting account / prospect / member ID combination so support can investigate.
Acceptance signals — how the platform detects them
1. A real-time notification from our integration partner the moment LinkedIn records the new connection (sub-second). Primary path. 2. 30-minute account-status polling fallback (covers the case where a notification never arrived). 3. Message-received inferred acceptance (when a prospect replies before LinkedIn's relation graph reflects the acceptance). 4. Engine 'already connected' check (when WarmySender retries a step and discovers via our LinkedIn provider that the recipient is already a connection).
All four paths now produce the same outbound notification (Slack / n8n / Zapier) and the same dashboard stamp. The notification tells you which of the four routes detected the acceptance.
Multi-account safety
Each LinkedIn account in your workspace runs its own daily / weekly cap, its own 4-week ramp schedule, and its own per-account budget. Adding a second account doesn't double your sends 'instantly' — each account ramps independently. The team-multiplier benefit is realized 4 weeks after each account is added.
Occasionally the WarmySender dashboard shows a status that doesn't match what you see on linkedin.com — a campaign tile says 'Connected · last activity 4h ago' but your LinkedIn shows a recent message; or your dashboard says an InMail was sent but your LinkedIn Sent folder doesn't show it yet. Here's why this can happen and what to do.
What WarmySender's status reflects
The platform reads two distinct timestamps for each LinkedIn account:
- Last session check — when our LinkedIn provider last successfully verified your session. This advances on routine health checks (roughly every 30 minutes) whether or not you sent anything. - Last activity — when your most recent send actually completed. This is what the dashboard tile shows, and it only advances when a real send goes out.
When the two diverge — for example, your session was just verified but no new sends have completed in the last few hours — the tile correctly shows the older 'last activity' time. This isn't a bug; the dashboard is being honest about what's happening on LinkedIn versus what's happening at the sign-in layer.
Why webhook events can be delayed
LinkedIn → our LinkedIn provider → WarmySender is a 3-hop chain. Most events arrive in under 10 seconds. Some can take longer:
- Acceptance notifications: typically under 5 seconds, occasionally minutes while LinkedIn propagates the new connection. - Reply notifications: typically under 10 seconds, occasionally minutes for messages from accounts in different LinkedIn data centers. - account.status_changed webhooks: typical < 30s, but can be delayed up to several minutes after a credentials rotation.
When events are delayed, the dashboard catches up via the 30-minute polling fallback. Worst case, your dashboard is up-to-date within 30 minutes even if a specific webhook missed delivery.
Why you might get a 're-login needed' email when the UI shows 'Connected'
This specific symptom usually means one of two things:
1. The account-lifecycle webhook source missed an event and our DB-side health probe surfaced the issue from the polling fallback before the webhook arrived. The platform now runs a daily audit cron that watches for this exact gap (account.* webhook source delivering 0 events for 24h+) and auto-recovers the subscription if needed. 2. Your LinkedIn session genuinely needs to be re-authorized — the email is right, the UI is stale. Click Reconnect on the LinkedIn Accounts page; the next polling tick will refresh the UI.
What to do when you see a stale UI
1. Hard-refresh the dashboard (Cmd-Shift-R on Mac, Ctrl-Shift-R on Windows). The frontend caches data for 30s; a hard refresh forces a fresh fetch. 2. Check the LinkedIn Accounts page directly — it's the most authoritative status surface. 3. Wait 30 minutes. The polling fallback runs every ~30 minutes and reconciles any drift. 4. If the UI is still wrong after 30 minutes AND a hard refresh, contact support — we'll trace the specific event chain and identify the gap.
The dashboard never lies on purpose
Several honesty fixes have been shipped in the last few months: what the status pill actually means, a 'last activity' tile derived from real sends rather than background health checks, deferring rather than burning a prospect when LinkedIn declines a profile lookup, and excluding reverted acceptances from your stats. Each closes a gap where the dashboard could show a number that didn't match reality. Our standing rule: if the platform isn't sure of a value, the tile is empty or shows 'Unknown' — never a stale or made-up number.
When a LinkedIn account disconnects (LinkedIn rotated your session token, you triggered a 2FA prompt, or the account was paused for any reason) WarmySender holds your campaign schedule in place — but it doesn't burst-send the backlog the moment you reconnect. This guide explains how the platform redistributes prospect schedules to keep your account safe.
The core invariant: account safety always wins
LinkedIn's anti-abuse signal-set heavily weighs 'unusual burst activity after a quiet period' as a strong automation signal. A disconnect of any duration followed by an immediate flood of messages or invites looks indistinguishable from a botted-account pattern, regardless of whether the activity is real or automated. The platform's design constraint is: never burst after a reconnect, ever.
What happens during a disconnect
- Sends that were already in flight when the disconnect occurred are released cleanly and put back in the queue, so nothing gets stuck half-finished. - Future-scheduled prospects whose next action falls during the disconnect window are NOT immediately moved. They stay on their existing schedule. - The campaign auto-pauses because its LinkedIn account is disconnected, so it doesn't try to send while the account is dark.
What happens during a reconnect
- The account flips back to Connected and re-registers for LinkedIn's real-time notifications. - The auto-resume sweeper resumes campaigns paused for the disconnect within ~5 minutes. - Prospects whose next action came due during the disconnect are moved forward to the next valid sending window. That move respects your active days, sending window start and end, timezone, and time-randomisation setting — exactly the same settings the campaign was authored with. - A small random offset (0-30 minutes) is added per prospect during redistribution so prospects that would otherwise share a scheduled minute are spread out.
Why this can sometimes look like 'all my prospects are scheduled for next Monday'
If your campaign's active days are restrictive (e.g., Monday and Thursday only), and the disconnect spanned multiple weekdays, the next valid sending window for a large block of prospects might land on the same Monday. The platform's drift reconciler now skips imminent-valid-day rows (next-action within 24h AND on a valid weekday) so genuinely-correct schedules don't get re-distributed unnecessarily — but if your chosen schedule is Monday and Thursday and the affected prospects all land in the same Monday window, that's the schedule doing what you set it to do, not a bug.
If you ever see hundreds of prospects scheduled for the same single Monday and that's NOT what you intended, please email support — we shipped a fix specifically to address an over-shift pattern that produced this exact symptom on May 2 2026, and we can redistribute the affected prospects for you.
The per-account ramp survives reconnects
Your 4-week LinkedIn safety ramp (10 invites/day → 50 invites + 150 messages/day) is per-account, not per-campaign, and it accumulates across disconnects. Reconnecting after a 24-hour disconnect doesn't 'reset' your ramp — you pick up from where you left off, slightly delayed. This is intentional: the ramp is what keeps your account safe.
Does the platform ever speed up after a reconnect?
Never. The platform always defers, never accelerates. If your dashboard shows a higher per-day cap than what's actually being sent, that's the daily cap (the upper bound) — not a target. Actual throughput respects the campaign's per-prospect timing, the account's ramp schedule, the per-account daily/weekly limits, and the per-account hourly burst limit our integration partner enforces. Each gate applies independently. Worst case after a reconnect: a few rows are deferred slightly longer than they would have been if the account had stayed connected. Best case: the schedule catches up smoothly within the next few sending windows.
If your dashboard says an InMail was sent but you can't find it in your LinkedIn Sent folder — or if your campaign shows 'Daily limit reached' when you know you haven't actually sent that many — this guide explains how WarmySender verifies InMail delivery, why InMails sometimes show as queued but don't deliver, and what's happening when your cap counter shows the wrong number.
Why InMails sometimes show as queued but don't deliver
A LinkedIn InMail can fail to deliver for reasons that look identical to success at first glance:
- Recipient eligibility — InMail can only be sent to recipients who allow InMails (most Premium / Sales Navigator / Recruiter members do; Free members can opt in via Open Profile). If a recipient has tightened their settings, the send is rejected. - Sales Navigator credits — Each InMail consumes one Sales Nav credit. If your account is out of credits, the send is rejected even though every other check passes. - Open Profile fallback — If you're sending via the 'classic' InMail API and the recipient has Open Profile enabled, the send goes through without consuming a credit. If their Open Profile is off, the send needs a credit and falls back to standard InMail rules. - Rate limits and ramp — LinkedIn's per-account InMail limits change with your account type and how long you've been sending. Sales Nav veteran accounts can typically send up to 50 InMails per day; new accounts ramp gradually from much lower numbers. - Connectivity gaps — A recipient on an account in transit, or a temporary LinkedIn-side issue, can return a soft failure that looks like 'sent' from our side.
In every case above, LinkedIn can accept the send request and still never create the conversation on the recipient's side. WarmySender's job is to tell those apart.
How we verify delivery
When WarmySender sends an InMail through our LinkedIn integration partner, a genuinely successful send comes back with a conversation identifier — the new InMail thread on LinkedIn's side. That conversation is the proof a real thread now exists for the recipient. No conversation, no delivery.
The delivery gate works like this:
1. WarmySender sends the InMail. 2. LinkedIn responds, and we look for the new conversation in that response. 3. If a real conversation comes back, we treat the send as successful: the send is recorded, the dashboard counter advances, your prospect is marked as messaged, and the thread is linked into your unified inbox. 4. If no conversation comes back — the silent-drop signature — we treat the send as failed: nothing is recorded, no counter advances, and the prospect is NOT marked as messaged. The send is classified as a phantom and your daily cap is preserved.
This is our proof-of-delivery contract. It guarantees that every number on your dashboard reflects a real conversation that exists on LinkedIn, not a request that succeeded on paper and quietly bounced.
A practical example: 18 days of phantom InMails caught by the delivery gate
On May 2, 2026 we found a bug where we were reading the wrong part of LinkedIn's response, which made every InMail look like a silent drop — 1,104 InMail sends across the platform over 18 days had no conversation attached. The new delivery gate (deployed earlier that morning) correctly refused to count any of them. We deployed a follow-up fix the same day so real conversations are recognised again and real InMails count.
The key takeaway: the gate did its job. Even while the underlying read was broken, the platform refused to inflate your dashboard numbers with phantom sends. That's the design — your dashboard tells you what reached LinkedIn, not what we hoped reached LinkedIn.
What happens if your daily cap shows the wrong number
The daily cap on each LinkedIn campaign counts how many sends have happened today. If the counter is inflated by historical phantom sends (recorded before the delivery gate landed), it can read 40/40 even though zero real InMails have actually been sent today.
We shipped a companion fix on May 2, 2026 to handle this exact case:
- Every historical phantom InMail (1,104 across the platform, going back to mid-April) is flagged as a phantom. Nothing is deleted; the records are kept for audit, refund eligibility checks, and accurate support answers. - The daily-cap calculation now subtracts flagged phantoms from your per-campaign cap. Before the fix, today's count was simply every InMail recorded today; after the fix, it is that total minus the phantoms. On a clean campaign with no phantoms, the number is identical.
If your campaign was reading 40/40 before the fix because of 40 phantom rows, post-fix it reads 0/40 immediately. Real ramp budget is intact: phantoms cost no LinkedIn-side capacity, so freeing the cap mathematically restores the actual day's budget without raising LinkedIn risk.
Monitoring and what's coming
Every InMail send is now recorded together with whether a real conversation came back, and every daily-cap calculation records how the phantom exclusion affected your specific campaign. That gives support an exact answer whenever a number looks off.
If your counter still looks wrong and you'd like it reset to the true value, reply to your support thread and we'll reconcile it by hand. We only do that after confirming real InMails are being recognised again, because lowering a cap counter is otherwise something we deliberately never do automatically.
Frequently asked questions
Q: Why didn't I see a failed-delivery alert before today? A: Before May 2 we recorded a successful send whenever the request itself came back without an error, whether or not a conversation was actually created. The delivery gate is new — it landed on the morning of May 2, 2026, and the follow-up fix that afternoon corrected which part of LinkedIn's response we read.
Q: Are my refunds for the phantom period automatic? A: Refund eligibility is reviewed manually for the 18-day phantom-affected period. If you sent InMails between mid-April 2026 and May 2, 2026 and consumed Sales Nav credits without messages reaching recipients, contact support with your account email and we'll review.
Q: Will this happen again? A: We added two automated guards alongside the fix: a test that pins the correct reading of LinkedIn's response, and a build-time check that fails if any future code path forgets to look for the new conversation. The same approach already caught two earlier families of regression — defense in depth is now standard wherever we depend on a specific piece of LinkedIn's response.
Q: What's the long-term plan for verifying delivery? A: We're extending the same delivery gate to connection invites and follow-up messages in the next release. Same verification, same proof-of-delivery contract. The eventual invariant: zero events on the dashboard that don't correspond to a real LinkedIn-side conversation or relationship change.
Short answer: a Sales Navigator or Recruiter list can only be imported when that subscription is active on the exact LinkedIn account you connected — and when you use the same LinkedIn account that owns the list. Those lists live behind LinkedIn's paid products, so a Free or Premium account (or a different account of yours) can't open them, and the import comes back empty.
The three things that must line up:
The subscription is active — Sales Navigator lists need active Sales Navigator; Recruiter lists need Recruiter. LinkedIn Free or LinkedIn Premium can't open a Sales Navigator list.
It's on the account you connected — the subscription has to be on the same LinkedIn account you connected to WarmySender, not a second account you own or a teammate's.
That account owns (or can see) the list — use the account that created the list or was given access. A private list inside one person's Sales Navigator isn't visible to a different account.
Have more than one account connected? Each account shows a plan badge (Sales Navigator, Recruiter, Premium, or Free) on the import screen and on the Accounts page — pick the one badged Sales Navigator. The badge tells accounts apart at a glance, which helps when two of yours have similar names.
Quick way to tell which case you're in: open the same list link in your browser while signed into the account you connected. If LinkedIn shows you the full list, that account can see it. If LinkedIn prompts you to upgrade or the list is empty in the browser too, that account doesn't currently have access — connect the account that owns the list.
Reconnected recently and now the list won't import (or the account shows as Premium)? Sometimes a reconnect brings the account back without its Sales Navigator access attached, even though your subscription is still active — so the plan can read as Premium and the list comes back empty. The one-click fix: on the import screen (or under LinkedIn > Accounts), use 'Re-check Sales Navigator access' on that account. WarmySender re-checks the connection and restores Sales Navigator access when it finds it, then you can run the import right away. If the re-check still can't find Sales Navigator access, reconnect the account with Sales Navigator open in your browser so the connection picks it up, then re-check once more. Setting the plan by hand only changes the label — the re-check is what actually restores access, so use it whenever an import is refused.
Reliable fallback: a regular LinkedIn people-search link (from LinkedIn's normal search bar) works on any connected account, including Free — no subscription needed. Run your search, copy the link from the address bar, and paste it into WarmySender to build your audience. Sales Navigator adds finer filters and saved lists, but a regular search link never depends on a paid tier.
For the full walkthrough with a worked example and FAQs, see the 'Why won't my Sales Navigator list import?' guide at /documentation/why-my-sales-navigator-list-wont-import.
If a card is declined when your LinkedIn seats renew, WarmySender safely pauses the seats and temporarily sets aside the connected LinkedIn accounts so nothing runs (no invites, messages, or follow-ups) while billing is unresolved. This is a protective hold, not a deletion — your campaigns pause in place with every prospect on its exact step.
You don't lose anything right away: your connected LinkedIn logins and your campaign progress are kept safe for a grace period of about a week. As soon as the payment goes through — update your card or pay the outstanding invoice on the Billing page — your seats reactivate and your LinkedIn accounts and campaigns come back automatically, resuming from exactly where they paused. If you paid within the grace window, you shouldn't need to reconnect anything.
If it's been longer than about a week: everything is still saved, but you may need a quick one-time reconnect of a LinkedIn account before its campaigns resume — fix the payment on Billing, then go to LinkedIn → Accounts and click Reconnect (a routine ~30-second LinkedIn sign-in). Reconnecting keeps your campaigns pointed at the same account and prospects keep their place.
Most common cause: a bank or card block on online or recurring subscriptions. Many business and corporate cards decline these by default, and some banks flag a renewal as unusual. The quickest fix is usually paying from a different card that allows online subscriptions, or asking your bank to allow recurring payments to WarmySender and then retrying.
'I paid but my accounts still show disconnected': give it a few minutes — reactivation and resume are automatic and can take a short moment to catch up. If an account still shows disconnected after that, click Reconnect on it. If it still won't come back, email [email protected] with your account email.
Your email side is unaffected: as long as your main plan is paid, your cold email campaigns keep sending and your email warmup keeps running; in Multichannel sequences, email steps continue and only LinkedIn steps wait for an active seat. When accounts return, sending resumes at your normal, safe pace — never a burst to catch up. For the full guide with examples and FAQs, see 'What happens to my LinkedIn seats and accounts if a payment fails?' at /documentation/linkedin-seats-after-a-failed-payment.
Automate Instagram outreach with WarmySender: connect your accounts, warm prospects up with follows, profile views and likes, then send DM campaigns — all inside safe daily and hourly limits that protect every account. Instagram DMs run right alongside your email and LinkedIn campaigns, built the same way as the rest of the platform: you build a sequence, add the people you want to reach, and WarmySender sends each step at a natural, human pace that keeps your account safe.
What you can do on Instagram:
Auto-follow a prospect's account.
Look up their profile to resolve their account and warm up your own activity (Instagram doesn't notify people of profile views).
Like one of their recent posts.
Comment on a recent post.
Send a DM — including to people who don't follow you yet, which lands in their Message Requests.
Here's how to get started:
Have a paid plan — Instagram is an add-on available on any paid WarmySender plan. If you're on the free tier, upgrade first from the Billing page.
Add an Instagram seat — Go to Billing and add an Instagram seat ($20 per seat per month, or $165 per seat per year to save). Each seat lets you connect and run one Instagram account. A seat belongs to the workspace you bought it in; if you need it in a different workspace, you can move it from the Billing page.
Connect your Instagram account — Go to Instagram > Accounts and connect. You'll sign in to Instagram on a secure page and, if you use two-factor authentication, enter your verification code. See 'Connect Your Instagram Account' for the full walkthrough.
Add the people you want to reach — Add prospects by their Instagram username or profile link, or from a list you've already built. WarmySender reaches the people you add. See 'Build Your Instagram Audience' for how to import handles from a CSV or paste them in.
Build a sequence — Go to Campaigns, click 'New campaign', and choose 'Instagram Campaign'. You can mix and match steps: Follow, View profile, Like a post, Comment on a post, Send DM, Wait a set time, Wait for reply, and branch with 'If replied'. A simple, effective starter sequence is Follow → Wait 1 day → Like a post → Wait 1 day → Send DM — warming the person up before your message lands lifts reply rates. Personalize the DM with merge tags like {{firstName}}, and add a 'Wait for reply' + 'If replied' branch after it so a reply stops the follow-ups automatically. See 'Build an Instagram DM Sequence' for how each step works.
Let it run safely — WarmySender paces every account inside its safe limits (a combined maximum of 100 actions per day and 10 per hour, shared across every action type — follows, profile views, likes, comments, and DMs), spaces actions out so they look natural, and eases new accounts in gradually with an automatic ramp-up. See 'How Instagram Outreach Stays Safe'.
Reply and track — When people respond, their replies land in your Inbox on the Instagram tab (your real-time, unified inbox), where you can reply personally. Inbound replies are never capped and the replies you send never count against your daily limit. Track follows, DMs sent, and reply rates on the Analytics page.
Standalone or multichannel — your choice:
Standalone — run Instagram entirely on its own from the Campaigns page.
Multichannel — add Instagram steps to a sequence that also includes email and LinkedIn steps, so one campaign reaches the same person across every channel. When someone replies, WarmySender stops the rest of that person's automated follow-ups, so you never over-message them.
Use several accounts at once (Pro plan and up): connect multiple Instagram accounts and have a campaign rotate its sends across them — pick Round-robin (take turns evenly), Random, or Weighted (send more from some accounts than others). Spreading outreach across accounts keeps each one comfortably inside its own safe limits, so your total reach grows without pushing any single account harder. Each prospect sticks to one account for the whole sequence, so every message a given person receives comes from the same consistent sender — natural and never confusing.
Good to know: a DM to someone who doesn't follow you back lands in their Message Requests on Instagram (this is normal — everyone's DMs to people they're not connected to work this way, and your message is still delivered). WarmySender shows you this clearly so it's never a surprise. See 'Why Some DMs Land in Message Requests'.
Instagram outreach works from an audience you bring — the people you already want to reach, each identified by their Instagram handle (@username). Unlike LinkedIn, there is NO in-app prospect search for Instagram: Instagram's platform doesn't allow prospect discovery through connected tools, so instead you bring the handles you already have. That's also an account-safety win — reaching people you genuinely chose, not a scraped list, is safer for your account. WarmySender never scrapes or searches Instagram for leads.
Two ways to build your audience:
Method A — Upload a CSV and save it as a list (best for a reusable, named audience):
Go to the Prospects page and choose Import to upload a CSV.
Include a column for each person's Instagram handle. A simple set of columns is first_name, last_name, instagram_username. The handle can be written as @janedoe, a bare janedoe, or a full link like instagram.com/janedoe or https://instagram.com/janedoe — WarmySender reads all of these as the same person, so you don't have to reformat your file.
On the mapping screen, map your handle column to the 'Instagram Username / URL' field (this is what makes each prospect reachable on Instagram). Map first_name and last_name to their fields, and map any extra columns (company, city, custom fields) so you can use them to personalize your DMs.
Save everyone to a named list (for example 'Instagram — creators Q3') so you can find and reuse the audience.
Open Campaigns, click 'New campaign', choose 'Instagram Campaign', and select your saved list as the audience on the Prospects step.
Example CSV (header row, then one row per person): first_name, last_name, instagram_username Jane, Doe, @janedoe Marco, Rossi, marcorossi Aisha, Khan, instagram.com/aisha.khan
Method B — Paste handles into the campaign wizard (best for a quick one-off): When you're building a campaign, the Prospects step lets you paste @handles directly — one per line — and WarmySender turns them into your audience on the spot, no upload needed. A bare handle or an instagram.com/... link works too. You can also start from a saved list and paste a few extra handles in the wizard.
What happens to prospects without a handle: a prospect can only be reached on Instagram if they have a handle. Anyone without one is simply skipped for the Instagram steps of a sequence — nothing errors, and the campaign keeps running for everyone who does have a handle. If fewer people are reached than you expected, the usual reason is missing handles; add them (re-import with the handle column mapped, or paste them in) and those people become reachable.
One audience across channels: a single list can carry an email address, a LinkedIn profile, and an Instagram handle at the same time, so the same people can power your email, LinkedIn, and Instagram outreach. Each channel uses the detail it needs and skips anyone who's missing it — which is exactly how a multichannel sequence reaches the same person across channels. When someone replies, WarmySender stops the rest of that person's automated follow-ups.
Full guide: /documentation/how-to-build-your-instagram-audience
Go to Instagram > Accounts and click 'Connect Account', then sign in on the secure Instagram page (username, password, and your two-factor code if you use one). It takes about a minute and only has to be done once per account. Here's the full walkthrough, plus what to do if the connection ever needs refreshing.
What connecting unlocks: Instagram DM outreach in WarmySender — you can warm prospects up with follows, profile views and likes, then send DM campaigns, all inside safe daily and hourly limits that protect your account, and read and reply to every conversation in one real-time inbox.
Before you start: you'll need an active paid plan and at least one Instagram seat added on the Billing page ($20 per seat per month, or $165 per seat per year). Each seat connects one Instagram account. A seat belongs to the workspace you bought it in; if you need it in a different workspace, you can move it from the Billing page. Personal, Creator, and Business accounts all work.
Connect your account:
Go to Instagram > Accounts and click 'Connect Account'.
You'll answer a couple of quick questions about the account (how established it is) so WarmySender can pick the right safe starting pace for it.
You'll then be taken to a secure Instagram sign-in page to log in with your Instagram username and password.
If your account uses two-factor authentication, you'll be asked for your verification code — enter it promptly, as these codes expire quickly.
Once you're signed in, you're brought back to WarmySender and your account appears on the Accounts page, ready to use.
Right after connecting: WarmySender takes a short moment to finish setting up and pulls in your recent conversations so your inbox is ready. New actions ease in gently for the first hour — this is deliberate, so a freshly connected account never starts with a burst of activity.
Why sign in on Instagram's own page? So your password is entered directly with Instagram and handled securely. WarmySender connects to your account the same careful way the official Instagram apps do.
If your account shows 'Disconnected' or 'Needs verification': Instagram occasionally asks you to sign in again — after a password change, a new-device check, or a security prompt. When that happens, open Instagram > Accounts and click 'Reconnect', then sign in again (and enter a fresh code if asked). Any campaigns that were using that account pause themselves while it's disconnected and pick right back up once it's healthy again — nothing is lost, and prospects stay exactly where they were in your sequence.
One account per seat: to run more than one Instagram account at the same time, add another seat on the Billing page, then connect the next account the same way.
Account safety always comes first — connecting, reconnecting, and the gentle first-hour ramp are all designed to keep your account in good standing.
Full guide: /documentation/how-to-connect-your-instagram-account
Every connected Instagram account has a combined safe budget of 100 actions per day and 10 per hour, shared across follows, profile views, likes, comments, and DMs. New accounts ramp up gradually, actions are spaced out naturally instead of fired in bursts, and replies you send to inbound DMs never count. Account safety always comes before speed — because a restricted or banned Instagram account is hard to get back.
That safety model is what lets you automate Instagram outreach with confidence: connect accounts, warm prospects up with follows, profile views and likes, then send DM campaigns, all inside limits that keep every account looking like a real person. Instagram watches for accounts that act faster or more aggressively than a real person would, and it restricts the ones that cross the line — WarmySender is built so your account never does.
The two limits that protect every account: - Up to 100 actions per day, per account. An 'action' is any single move: a follow, a profile view, a like, a comment, or a DM. They all share one combined daily budget of 100. - Up to 10 actions per hour, per account. On top of the daily cap, no account does more than 10 actions in any single hour, so activity never comes in a sudden burst.
Both limits are combined across every action type — it's a shared pool, not 100 of each. For example, if your account has already done 40 follows and 30 DMs today, that's 70 of your 100 actions used, with 30 left for anything else. When either limit is reached, WarmySender simply pauses that account's outbound actions and resumes automatically — the next hour for the hourly cap, the next day for the daily cap. Your prospects stay exactly where they are in the sequence and continue right where they left off.
Replying is always free: answering someone who has messaged you never counts against these limits. The caps are only about starting new outreach — genuine conversations are never held back.
New accounts start slow and build up: a brand-new or freshly connected account doesn't jump straight to 100 a day. WarmySender begins with a small daily number in the first week and increases it gradually over several weeks as the account settles into a steady, trusted rhythm. Well-established accounts ramp up faster; an account recovering from a restriction ramps up slower and to a lower ceiling. This gradual warm-up is the single most important thing that keeps accounts healthy.
Actions are spaced out, not fired all at once: even within the hourly limit, WarmySender leaves natural gaps between actions and varies the timing, so your account never shows a robotic, evenly-timed pattern.
See your usage any time: each Instagram account shows a simple safety meter — how many of today's 100 actions you've used, and how many of this hour's 10. So you always know where you stand at a glance.
What if Instagram pushes back anyway? If Instagram ever signals it wants an account to slow down, WarmySender backs off that account for a cooldown period rather than pushing through — the careful response that protects the account. You'll see the account rest and then resume on its own.
We never loosen these limits to send faster. They exist to keep your account safe, and that's a line WarmySender holds for you.
Full guide: /documentation/how-instagram-outreach-keeps-your-account-safe
Go to Campaigns > New campaign > Instagram Campaign, add your audience, and build a sequence from steps like Follow, View profile, Like a post, Comment on a post, and Send DM — with Wait delays and a Wait for reply / If replied branch between them. WarmySender runs it automatically for every prospect, inside each account's safe daily and hourly limits. You build it once, add your people, and it runs for everyone at a natural pace.
An Instagram sequence is the series of steps WarmySender runs for each person you're reaching out to — from a first friendly touch to a direct message. It's how you automate Instagram outreach: warm the person up with a follow, a profile view or a like, then send the DM, all safely paced.
Where: Go to Campaigns, click 'New campaign', and choose 'Instagram Campaign'. Name it, choose the Instagram account (or accounts) to send from, add the people you want to reach, then build your steps.
Sending from several accounts (Pro plan and up): if you pick more than one Instagram account, the campaign rotates its sends across them — choose Round-robin (take turns evenly), Random, or Weighted (favor some accounts over others). Each prospect is assigned to one account and stays with it for the entire sequence, so every message a person gets comes from the same consistent sender. Spreading sends across accounts keeps each one well inside its own safe daily and hourly limits.
The building blocks (add any of these, in any order): - Follow — Follow the person's account. A light, friendly first touch that often makes a later DM land warmer. Counts as one action. - View profile — Look up their profile to resolve their account and warm up your own activity, the same as looking someone up on Instagram (Instagram doesn't notify people of profile views). Counts as one action. - Like a post — Like one of their recent posts. A low-key way to get on their radar before you message. Counts as one action. - Comment on a post — Leave a genuine comment on a recent post (up to 1,250 characters). Best used sparingly and kept authentic. Counts as one action. - Send DM — Send a direct message (up to 1,000 characters). This is the heart of most sequences. Counts as one action. - Wait — Pause for a set amount of time before the next step, so your touches are spread out naturally rather than all at once. Not an action. - Wait for reply — Pause the sequence until the person replies (with a maximum wait you set). If they reply, they move on; if they don't within your window, the sequence continues. Not an action. - If replied — Branch the path: do one thing if the person has replied, and something else if they haven't. Perfect for sending a follow-up only to people who went quiet. Not an action.
A simple, effective starter sequence (5 steps): Follow → Wait 1 day → Like a recent post → Wait 1 day → Send DM. This warms the person up before your message ever arrives, which lifts reply rates. It spends three outreach actions per prospect (the two waits don't count), so at the full daily ceiling one account reaches up to ~33 prospects a day. Add a Wait for reply (up to 3 days) and an If replied branch after the DM to send a short, friendly follow-up only to people who went quiet.
Personalize your messages: use merge tags like {{firstName}} in your DM and comment text, and WarmySender fills in each person's details so every message reads like it was written just for them. Add a fallback (for example {{firstName | default: 'there'}}) so a message still reads naturally if a detail is missing.
Test what works: your Send DM and Comment steps can be A/B tested — write two versions and WarmySender splits them across your prospects so you can see which wording earns more replies.
Control the pace: set your sending days, hours, time zone, and a daily action limit for the campaign. On top of whatever you choose, WarmySender always keeps each account inside its safe limits (a combined 100 actions a day and 10 an hour) — so if your settings would ever go faster than is safe, safety wins and the step simply waits.
One DM per person, not spam: a sequence is designed to build a real conversation, not blast messages. Keep it to a couple of thoughtful touches, and let 'Wait for reply' and 'If replied' stop the follow-ups the moment someone responds.
Full guide: /documentation/how-to-build-an-instagram-dm-campaign
When you send a DM to someone who doesn't follow you, Instagram files it in their Message Requests folder rather than their main inbox. This is completely normal — it's how Instagram handles messages from people you're not connected to, for everyone, and it's not a fault with WarmySender or your account. Your message was delivered; it's just waiting in the requests folder for them to open. The single biggest thing you can do to lift replies is to warm the person up first (a follow, a genuine like or comment) before the DM, so your name looks familiar when it lands.
What Message Requests are: a separate folder where Instagram collects DMs from accounts a person doesn't follow. The person can still see and open these messages — they just have to tap into their Requests to find them, and they may not get the same notification as a message from someone they follow. Once they open your message and reply (or accept the request), the conversation moves into their normal inbox and everything flows as usual from there.
Why this matters for your outreach: a message sitting in Requests can be seen a little later, or missed, compared to one in the main inbox. That's the single biggest reason a good DM sometimes goes unanswered — not because it wasn't delivered, but because it's waiting in a folder the person checks less often.
WarmySender shows you this clearly: when a step sends a DM to someone who isn't following you, you'll see a note that the message may land in their Message Requests. We surface it on purpose rather than hiding it, so you always understand where your message actually went and can set your expectations accordingly.
How to land in the main inbox more often: - Warm the person up first. Add a Follow, a profile View, or a Like before your DM. When someone recognizes you (or follows you back), your message is far more likely to reach their primary inbox. - Give it a beat. Put a Wait step between warming up and messaging, so there's a natural gap rather than an instant follow-then-DM. - Make the first line count. Because Requests often show only a preview, a strong, genuine opening line earns the tap that opens your message. - Reach mutuals and existing followers when you can — messages from accounts a person already follows skip Requests entirely.
Is there any way to force a DM into the main inbox? No — and no tool can, because it's Instagram's own rule, not a setting. The reliable path is to become someone the recipient recognizes first, which is exactly what a warm-up sequence (Follow → Like → Wait → DM) is built to do.
Full guide: /documentation/why-some-instagram-dms-go-to-message-requests
Open your Inbox and switch to the Instagram tab to see every Instagram conversation in one place — chats your campaigns started, replies from message requests, and inbound DMs — and reply to any of them in real time, without switching to the Instagram app. Replies show up as they arrive, and the replies you send back never count against your daily outreach limit, so you can answer as many as you like. It's your one place to keep every outreach conversation moving.
Where: Open your Inbox and switch to the Instagram tab — the same Inbox holds your email and LinkedIn replies, each channel on its own tab. Pick a conversation to see the full back-and-forth, then type your reply and send — it goes straight to the person on Instagram. If you have more than one Instagram account connected, your conversations are organized per account.
Messages sync automatically: new replies appear on their own, so your inbox stays current without you refreshing anything. You'll see unread conversations stand out so it's easy to spot who's waiting on you.
Replying is always safe and unlimited: answering someone who has messaged you never counts toward your account's daily or hourly action limits. Those limits only apply to starting new outreach — real conversations are never held back, so reply as much as you like.
Keep your inbox tidy: - Mark as unread — Flag a conversation you've read but want to come back to, so it shows as unread again. Your 'deal with this later' marker. - Mute — Quiet a conversation that's pinging you more than it's worth. It stays in your inbox and you can open it any time; it just stops nudging you. Muting is private — the other person isn't notified. - Filter to unread — Show just the conversations that need a reply, as one tidy to-do list.
Replies stop the robots automatically: the moment someone replies, WarmySender stops the rest of their automated follow-ups by default (Stop-on-Reply), so a real conversation is never interrupted by another scheduled DM. If you're reaching the same person on more than one channel, a reply can also stop their follow-ups on the other channel — so you never accidentally keep messaging someone who's already talking to you.
Make it personal: the inbox is for genuine, one-to-one replies once someone responds. This is where a thoughtful, human answer turns an opened DM into a real conversation — the whole point of the outreach.
Full guide: /documentation/managing-your-instagram-inbox
The Instagram add-on is $20 per seat per month, or $165 per seat per year — one seat per Instagram account you connect and run. Add, adjust, or cancel seats any time from the Billing page. Each seat unlocks full outreach for one account: sequences, real-time inbox, and analytics, all inside the safe daily and hourly limits that protect the account.
Pricing: $20 per seat per month, or $165 per seat per year (paying yearly saves you money versus monthly). Each seat lets you connect and run one Instagram account with full outreach — sequences, inbox, and analytics.
Which workspace a seat belongs to: a seat lives in the workspace you bought it in, so its account is available in that workspace. If you need the seat in a different workspace, you can move it from the Billing page — you don't have to buy a new one.
What you need first: an active paid WarmySender plan. Instagram is an add-on on top of your plan, available on any paid tier. If you're on the free tier, upgrade first, then add Instagram seats.
Add seats: 1) Go to Billing and find the Instagram add-on card. 2) Choose how many seats you want (one per account you plan to connect) and whether to bill monthly or yearly. 3) Confirm — your seats are ready right away, and you can head to Instagram > Accounts to connect your account(s). If you're adding seats to a plan you already pay for, the new seats are prorated so you only pay for the remaining part of the current billing period.
Add more later: need another account? Add another seat any time from the same Billing card — connect the new account once the seat is active.
Reduce or cancel seats: you can lower your seat count or cancel the Instagram add-on from the Billing page. Changes to reduce seats take effect at the end of your current billing period, so you keep the seats you've paid for until then — nothing is cut off mid-cycle. Your connected account and its conversation history remain visible; only new outreach stops when a seat is removed.
Monthly vs yearly: monthly gives you flexibility to change month to month; yearly locks in the lower per-seat rate. You can start monthly and switch to yearly later to save.
Where to see live pricing: the Billing page and warmysender.com/pricing always show the current rates and any active offers — the live page is the source of truth if anything ever differs.
One bill, all channels: your Instagram seats appear on the same account billing as your plan and any LinkedIn seats, so everything's in one place.
Full guide: /documentation/instagram-seats-and-billing
The best Instagram outreach warms people up before it messages them, keeps every DM short and personal, and stays inside safe limits — a good starter pattern is Follow → Wait 1 day → Like a post → Wait 1 day → Send DM. Instagram is a personal, visual space, so outreach that feels human and relevant does far better than anything that reads like a mass message. These are the habits that earn replies while keeping your account safe.
Warm up before you DM. A cold message to a stranger lands in their Message Requests and is easy to miss. Add a Follow, a profile View, and a Like of a recent post before your first DM, with a Wait step in between. When someone recognizes you, your message is more likely to reach their main inbox and get read.
Make the first line about them, not you. The opening line is often all that shows in a preview, so it decides whether your message gets opened. Reference something specific — a recent post, what they do, a shared interest — instead of leading with a pitch. Personalization tags like {{firstName}} help, but a genuine, specific hook helps more.
Keep it short and human. A DM up to 1,000 characters is plenty, but the best ones are far shorter — a couple of friendly sentences that invite a reply, not a wall of text. Write the way you'd actually message someone.
Comment sparingly and sincerely. A thoughtful comment on a recent post can get you noticed, but generic or frequent comments read as spam. Use comments as an occasional, genuine touch — never on every prospect.
Give people room to reply. Use a 'Wait for reply' step and keep follow-ups gentle and few. One friendly nudge to someone who went quiet is fine; repeated messages are not. Let a reply stop the rest of the sequence automatically, so a real conversation is never interrupted by another scheduled DM.
Let new accounts warm up. A freshly connected account starts with a small daily number of actions and builds up over several weeks — don't try to rush it. This gradual ramp is the biggest single factor in keeping an account healthy, and pushing harder early is what puts accounts at risk.
Respect the pace. WarmySender keeps every account inside a combined 100 actions a day and 10 an hour, and spaces them out. Watch each account's safety meter, and treat those limits as your friend — they're what keeps your account in good standing for the long run.
Reply fast and personally. When someone responds, answer promptly from your Instagram inbox with a real, one-to-one message. The automation's job is to start the conversation; yours is to make it human from the first reply.
Target quality over quantity. A smaller list of well-chosen, genuinely-relevant people will always beat a huge generic one. Relevance is what turns a DM into a conversation.
Go multichannel thoughtfully. Reaching the same person by email, on LinkedIn, and on Instagram can lift responses — but a reply on any channel stops the follow-ups on the others, so you stay helpful and never overwhelming.
Above all: be someone worth replying to. Warm up, personalize, keep it short, respect the pace, and let real conversations take over. Account safety always comes first.
Full guide: /documentation/instagram-outreach-best-practices
Prospects are your campaign contacts, managed from the Prospects page:
Global Statuses:
Active — Available for campaigns
Bounced — Email bounced (automatically set)
Invalid — Email address is invalid
Unsubscribed — Prospect opted out
Do Not Contact (DNC) — Manually marked, blocks all outreach
Suppressed — Blocked by suppression list
Adding Prospects:
CSV Import — Upload a CSV file with column mapping (see CSV Import guide)
Paste Data — Paste tab or comma-delimited data directly
Single Add — Manual form entry with all fields
From Leads Database — Save leads from the built-in 200M+ contact database
From LinkedIn — Import from LinkedIn audience enrichment
Prospect Lists: Organize contacts into named lists with custom colors. Each list tracks its prospect count. Use lists to: • Segment contacts by industry, role, or campaign • Create campaigns from specific lists • Keep imported batches organized
Bulk Operations:
Select multiple prospects using checkboxes (or 'Select All')
Bulk delete (with active campaign guard — can't delete prospects in active campaigns)
Bulk status update (change global status)
Bulk add to prospect list
Bulk add to campaign
Bulk suppress — block the selected people from all future outreach in one action (details below)
Bulk-Suppress Selected Contacts (Never Email Them Again): When you want to stop reaching a group of people for good — competitors, existing customers, anyone who asked not to be contacted — you can suppress them straight from this list without leaving the page: 1) Tick the checkboxes next to the people you want to suppress (or use 'Select all' to grab everyone matching your current filters). 2) Choose the 'Suppress' bulk action. 3) Confirm. Those addresses are added to your workspace blocklist and are immediately skipped by every campaign — the current one and any future one. This is the fastest way to suppress a handful or a whole filtered segment at once. For uploading a long external list of addresses or whole domains you never want to email, use Settings → Blocklist → Import CSV instead (see 'Suppression Lists & Compliance'). Suppressing does not delete the contacts — they stay in your account marked Suppressed, and you can see them anytime by filtering the list to the Suppressed status.
Filtering & Search:
Text search across email, first/last name, and company
Filter by global status
Filter by prospect list (sidebar)
Pagination with configurable page size
Each prospect also has per-campaign statuses: new, contacted, replied (positive/neutral/negative), bounced, unsubscribed, DNC — these are tracked independently for each campaign the prospect is enrolled in.
Your contacts live in your account once, and you can add the same contact to as many campaigns and lists as you want. You never have to re-upload people you've already added, and if you do re-upload them, the existing contact is reused instead of creating a second copy — so your list stays clean and you never get duplicate sends. If you see "already in your account", that's confirmation the contact is there and ready to use again — NOT an error.
Three ways to reuse existing contacts in a new campaign:
1) Select contacts and create a campaign (the most direct way):
Go to Contacts, use search and filters to narrow to the people you want.
Tick the checkboxes (or 'Select all').
Choose 'Add to campaign' → 'Create a new campaign' (or add them to an existing draft).
Finish building the campaign and launch. The same contacts stay in their other campaigns and lists.
2) Save contacts to a list, then pick that list:
On the Contacts page, select contacts and choose 'Add to list' — create a new list or use an existing one.
Start a new campaign from Campaigns → New Campaign.
At the audience step, choose 'Add from a list' and pick your list. Everyone in it is added.
A contact can be in several lists at once, and a list can feed many campaigns — the tidy way to reuse the same audience over time.
3) Re-import a CSV into a list (no duplicates, and your custom fields fill in):
Start an import and choose to add the imported contacts to a list (new or existing). Upload your CSV.
People already in your account are matched to their existing contact (by email address) and added to the list — no second copy, nothing lost.
Any custom columns in your file are merged onto those existing contacts: new fields are added, changed values are updated, and a blank cell never erases a value you already had. So re-uploading is also how you fill in or refresh personalization (for example, adding a custom:first_line column you didn't have on the first import) — it lands on the existing contacts and they still join the list.
Built-in fields (first name, last name, company, job title, city…) work differently: they are only filled in when they're currently empty, and an existing value is never overwritten. That protects any name you've corrected by hand from being undone by a later spreadsheet — but it also means you can't fix a name by re-uploading. Edit the contact on the Contacts page instead.
People who are new are added as fresh contacts and put in the list too.
The import summary shows how many were newly added vs already in your account. The 'already in your account' count is the safety net working as intended — those contacts still get your new fields and still join the list.
'Already in your account' is not an error: it means the person was recognized and their existing record reused instead of duplicated. Your contact stays a single record with one history, no matter how many times you re-upload them or add them to new campaigns and lists. This is also why you'll never accidentally email the same person twice from one campaign because they appeared twice in a spreadsheet.
For a full walkthrough with examples, see /documentation/reuse-existing-contacts-in-a-new-campaign. Related: 'Prospect Lists & Campaign Creation', 'CSV Import (Advanced Guide)', 'Contacts & CRM'.
The Contacts section provides a CRM-style view of people you have interacted with across your campaigns.
Accessing Contacts: Go to Contacts from the sidebar to view your contact list.
Contacts vs. Prospects: Prospects are people you plan to reach out to — they are your campaign targets. Contacts are people you have already interacted with, whether through email replies, LinkedIn conversations, or manual outreach. When a prospect replies to a campaign or engages with your LinkedIn messages, they become a contact with a full interaction history.
Viewing Contact Details: Click on any contact to see their full profile including: • Contact information (email, phone, company, role, location) • Interaction history — every email sent and received, LinkedIn messages, and campaign touchpoints • Campaign enrollment history — which campaigns they were part of and their status in each • Notes and tags added by your team
Filtering & Searching:
Search by name, email, company, or any contact field
Filter by interaction type (email reply, LinkedIn reply, manual)
Filter by campaign or prospect list
Sort by most recent interaction, name, or company
Use the Contacts view to manage ongoing relationships and follow up with engaged prospects outside of automated campaign sequences.
Your total contact count can be higher than the numbers on your named lists — and that's normal, not a bug. This guide explains why, and how to review the contacts that aren't in any list from the new 'Not in a list' view on the Prospects page.
Why your total is higher than your lists: Every contact in your account counts toward your plan's contact limit — whether or not it's in a named list. Lists are just a way to organize people; a contact can exist in your account without belonging to any list. The most common way that happens is LinkedIn imports: when you bring people in from LinkedIn, they're added to your account so you can reach them, but they aren't automatically placed in one of your lists. A few other flows can add contacts without a list too. Those contacts don't appear in any list count, but they still take up space against your plan limit — so your plan usage can be higher than your lists add up to, by exactly the number of contacts that aren't in a list.
Opening the 'Not in a list' view: 1) Go to the Prospects page. 2) In the lists sidebar on the left (where your named lists appear), click 'Not in a list'. 3) You'll see every contact that isn't in any named list, gathered in one place with its own count. This view only appears when you actually have contacts that aren't in a list. As the in-app note says: these contacts aren't in any list, but they still count toward your plan — so this is where you tidy them up.
Three things you can do here: • Add them to a list — select the contacts and add them to a new or existing list to organize them. This keeps the contacts, so it doesn't change your total; it just files them where you can find and use them in campaigns. • Remove the ones you don't need — delete contacts you don't plan to reach out to. Removing a contact frees up a slot against your plan limit, so this is the way to make room without upgrading. • Upgrade for more capacity — if you'd rather keep everyone, move to a plan with a larger contact limit and the whole account gets more room. Adding to a list and removing contacts do different jobs: adding to a list organizes (your total stays the same), while removing contacts — or upgrading — is what changes how much room you have.
Worked example: If your named lists add up to about 3,443 contacts but the usage at the top of the Prospects page says 10,000 / 10,000 (full), the gap isn't a mistake — it's contacts that aren't in any list, often LinkedIn imports. Open 'Not in a list' to see exactly who they are, then add the ones you want to keep to a list, remove the ones you don't need to free up space, or upgrade for a higher limit.
FAQ: Q: Why is my contact count higher than my lists? A: Every contact counts toward your plan's contact limit whether or not it's in a list, and some contacts (most often LinkedIn imports) are added to your account without being placed in a list. Those don't appear in your list counts but still use space. Open 'Not in a list' on the Prospects page to see them.
Q: Do LinkedIn contacts count toward my limit? A: Yes. Contacts imported from LinkedIn are added to your account and count toward your plan's contact limit, even though they aren't automatically placed in a named list. You'll find them in the 'Not in a list' view.
Q: How do I free up space without upgrading? A: Open 'Not in a list' on the Prospects page, then remove the contacts you don't need — deleting a contact frees up a slot against your limit. Adding contacts to a list organizes them but doesn't change your total; removing them (or upgrading) is what changes how much room you have.
Q: Where do I find the 'Not in a list' view? A: Go to Prospects, then click 'Not in a list' in the lists sidebar on the left. It shows every contact that isn't in any named list, and it appears whenever you have contacts that aren't in a list.
For a full walkthrough with the worked example and FAQs, see /documentation/why-is-my-contact-count-higher-than-my-lists.
Custom fields: use prefix custom: (e.g., custom:department, custom:source)
Auto Column Mapping: The system automatically maps common column name variations: • 'e-mail', 'e_mail' → email • 'first name', 'first_name' → firstName • 'last name', 'last_name' → lastName • 'company name', 'company_name' → company • 'title', 'job_title', 'position' → role • 'telephone', 'mobile' → phone • 'linkedin', 'linkedin_url', 'linkedin_profile' → linkedinUrl
You can also manually map any column during the import wizard.
Validation & Deduplication:
Email format validation (must be valid format)
MX DNS validation (domain must have valid mail server)
Dedup by email within the file and against existing workspace prospects
LinkedIn URL dedup for LinkedIn-only rows
Suppression list check (both email-level and domain-level)
LinkedIn-Only Rows: If a row has no valid email but has a LinkedIn URL, a placeholder email ([email protected]) is generated so the prospect can exist in the system.
Custom Fields: Any CSV column not matching a built-in field is stored as a custom field. Field names are sanitized: lowercased, non-alphanumeric characters replaced with underscores, max 30 characters.
Re-Uploading to Add or Update Custom Fields: You can upload the same contacts again later to fill in or refresh their custom fields — you don't have to get every column right the first time. • Contacts are matched by email address. When a match is found, the custom fields from your new file are ADDED to that existing contact, and changed values are updated. Nothing you imported before is lost. • A blank cell never wipes an existing value. If your new file leaves a column empty for a contact who already has a value there, the existing value is kept — only real, filled-in values are written. • Those matched contacts are also added to the list you're importing into, so if you're building a list, it ends up complete (both the brand-new people and the ones already in your account). • Practical fix: if you added a personalized column (say custom:first_line) after your first import and it didn't appear, just upload the list one more time with that column filled in. It fills in on the existing contacts and they join the target list.
What a Re-Upload Will NOT Change (Built-In Fields Are Fill-Only): Re-uploading updates your custom columns, but it treats built-in contact fields differently — and this catches people out, so it's worth knowing up front. • Built-in fields (firstName, lastName, company, role, phone, website, country, city, industry) are only filled in when they are currently EMPTY on that contact. If a contact already has a first name, re-uploading a file with a different first name will NOT change it. • This is deliberate: it means an import can never quietly overwrite a name or company you corrected by hand, and a messy export can't undo your cleanup. • The trade-off: fixing a name by re-uploading a spreadsheet does not work. If you re-upload with corrected names (for example changing 'J. Guilherme' to 'Dr. João Guilherme') and nothing appears to happen, this is why — the existing value wins, and the import isn't broken. • To change a built-in field on a contact you already have: edit the contact directly on the Contacts page. To rebuild from scratch: delete the contacts first, then re-import. • Custom columns are the exception — those DO update on re-upload, which is why personalization columns are the right place for data you expect to refresh.
Using Custom Columns as Merge Tags: Every custom column you import becomes a merge tag you can use in your campaign emails — including in the subject line. For example, a column custom:icebreaker becomes {{custom.icebreaker}} or {{icebreaker}} in your templates. This lets you send fully pre-written, personalized emails where every part is unique per prospect.
Import Progress:
Large imports run asynchronously — you can close the page and come back
Progress bar shows processed rows, created, duplicates, invalid, and suppressed counts
Maximum 10,000 rows per import
Example CSV: email,firstName,lastName,company,role,phone,linkedinUrl,website,country,city,industry,custom:department [email protected],John,Smith,Acme Corp,VP Sales,+1234567890,linkedin.com/in/johnsmith,acme.com,US,New York,Technology,Engineering
The Leads Database contains 200M+ verified B2B contacts from the US and Canada:
Data Sources & Coverage: Our B2B leads database is compiled from multiple reliable and publicly available sources, including verified business directories, government registries, and public filings. The data is sourced independently and enriched through multiple verification passes to ensure quality.
Geographic Coverage:
United States — the largest share of the database, across all 50 states
Canada — full coverage across all provinces
Plus growing international coverage — use the Country filter to explore
Industry & Sector Coverage: The database covers a wide range of B2B sectors and industries including: • Professional Services, Technology/SaaS, Healthcare, Construction, Legal • Restaurants & Food Service, Real Estate, Financial Services, Manufacturing • Retail, Education, Nonprofits, Government Contractors, and many more • Use the Category and Industry filters to search within your target sector
Phone Numbers: Phone numbers in our database are business phone numbers sourced from directory listings and public filings. We do not provide personal mobile or cell phone numbers.
Data Accuracy & Freshness:
Lead data is enriched from multiple sources and cross-referenced for accuracy
The database is continuously updated with new imports and enrichment passes
Use the 'Has Email' filter (on by default) to see only leads with email addresses
Use the Email Verifier before launching campaigns to ensure maximum deliverability
Accessing Leads:
Go to Leads from the sidebar
Available on Pro ($14.99) plans and above
Free plans see an upgrade prompt
Search Filters:
Keyword — Matches name, company, email, industry, and description
Country — Dropdown selector (cascading: resets state/category when changed)
Category — Business category (e.g., Restaurant, Plumber, SaaS)
State / Province — Geographic filter
City — Free text city filter
Has Email — Show only leads with email addresses (ON by default)
Has Phone — Show only leads with phone numbers
Lead Data Available:
Contact info: name, email, business phone, job title
Company info: business name, website, employee count, revenue range, industry
Enrichment: Google Maps rating, review count, year founded, description
Multi-contact: Up to 5 contacts per business with names, titles, emails, and LinkedIn URLs
Monthly Leads by Plan:
Pro plan: 1,000 leads/month
Business plan (existing customers only): 5,000 leads/month
Enterprise plan: 15,000 leads/month
Ultimate plan: 30,000 leads/month
Your monthly leads refresh on your billing anniversary (works the same on monthly and annual plans)
Daily Pace (your monthly leads, spread across the month):
Rather than handing you the whole month at once, WarmySender spreads your monthly leads evenly across the month, so a portion becomes available to save each day
Your daily share is roughly your monthly allowance ÷ 30 — about 33/day on Pro, 166/day on Business, 500/day on Enterprise, and 1,000/day on Ultimate
This keeps fresh leads available every day instead of letting a whole month drain in one sitting, and keeps your list-building (and the sending that follows) at a healthy, steady pace
What a Lead Costs (browsing is free):
Searching, filtering, and paging through results are always free — no lead is spent just for looking
Emails show masked (partly hidden) in search results; the full address appears once you save the lead to a list or reveal it — that's the moment a lead is spent
One lead = one NEW save or export; re-saving a lead you already have is free (never charged twice)
Records with no email aren't charged
Your remaining monthly leads, today's share, and any lead-credit balance are shown at the top of the Leads page
Lead Credits (keep going past today's limit or your monthly allowance):
Lead credits are an optional one-time top-up that never expire and skip the daily pace
Use them to save past today's share right now, or to keep going once your whole monthly allowance is used
Your plan's leads are always spent first — credits sit in reserve and only draw down once your daily (or monthly) allowance is used up
One credit saves or exports one new lead, exactly like a plan lead; browsing and re-saving already-saved leads stay free
Packs (one-time, never expire): 10,000 = $15, 30,000 = $39, 75,000 = $79 (best value), 150,000 = $139, 350,000 = $299 — buy from the Leads page; your balance goes up instantly
Full guide: /documentation/lead-credits-and-daily-limits
Saving & Exporting:
Select leads individually or all-on-page
'Save to List' — Save to a new or existing prospect list (shows dedup results)
'Export CSV' — Download as CSV file (spends one lead per new contact; already-saved contacts are free)
Creating Campaigns from Leads:
Save leads to a prospect list
Go to the 'Saved Leads' tab
Select your list and click 'Create Campaign from List'
This navigates to the campaign wizard with the list pre-selected
Find your ideal B2B leads fast by stacking filters in the built-in Leads Database. Each filter you add narrows the results, so combining a few turns hundreds of millions of contacts into a focused shortlist of decision-makers — then save the shortlist to a list and launch a campaign from it.
The Filters You Can Use:
Location — Choose a country first, then optionally a state/province, then a city. Best for regional targeting and keeping time zones consistent in one send.
Job title — Free-text search for the role wording (e.g. 'Marketing Manager', 'Head of Sales'). This is the richest, best-populated field — almost every contact has a title. Tip: prefer whole words over abbreviations ('vice president' not 'VP', 'human resources' not 'HR').
Seniority — Target the level of the role regardless of exact wording: C-level, VP, Director, Head, Manager.
Department — Target the function: Marketing, Sales, Engineering, Finance, HR, and more.
Verified email only — Limit to contacts whose work email passed a deliverability check (the highest-confidence addresses). Cleaner lists mean fewer bounces, which protects your sender reputation.
Has LinkedIn — Show only contacts with a LinkedIn profile on record. Ideal for multichannel outreach (email + LinkedIn in the same sequence).
Filters are additive — the more you add, the smaller and more precise the list. A live match count updates as you go, so you can find the balance between 'too broad' and 'too few'.
Three Example Searches:
Marketing VPs in Canada with a verified email and a LinkedIn profile — Location: Canada · Department: Marketing · Seniority: VP · Verified email only: on · Has LinkedIn: on. A clean, multichannel-ready list of senior marketing decision-makers in one market.
Founders and CEOs of US companies with a verified email — Location: United States · Seniority: C-level (add the title word 'founder' to widen it) · Verified email only: on. Leave Department off to reach the leader of the whole company.
HR managers in a specific city — Location: country, then state/province, then city · Department: HR (search 'human resources' in Job title to widen it) · Seniority: Manager. Watch the live count — if a city is too narrow, search the whole state/province instead.
What We Don't Filter On (Yet): WarmySender's targeting is built around people — role, seniority, department, location, and reachability by email and LinkedIn — and those filters are reliable because that information is well covered. We do NOT currently offer dependable company-size (headcount) or revenue filters: that information is available for only a small fraction of records, so filtering on it would hide most of the contacts you'd want to see and return a misleadingly small list. We've left those filters out rather than quietly drop good leads. If company-size or revenue targeting matters to you, email [email protected] so we can prioritize.
After Filtering:
Select contacts (individually or all on the page).
'Save to List' — add to a new or existing prospect list (you'll see how many were added vs duplicates).
Create a campaign straight from the list, or export it as a CSV. Saved leads land in the same prospect list a CSV import would create, so sequences, sending limits, warmup, and analytics all work identically. Run the list through the email check before your first send to keep it clean.
Full walkthrough with worked examples: warmysender.com/documentation/find-your-ideal-leads-with-filters
WarmySender includes a built-in Email Verifier to validate email addresses before campaigns — reducing bounces and protecting sender reputation. Included free with all paid subscription plans.
Plan Limits:
Pro ($14.99/mo): 300 verifications/month
Enterprise ($69.99/mo): 1,500 verifications/month
Free trial, Starter, and Lifetime plans: Not available (upgrade to Pro+)
Each plan also has a daily allowance equal to its monthly total ÷ 30 (about 10/day on Pro, 50/day on Enterprise); a verification needs room in both the monthly and the daily allowance
Monthly usage resets on the 1st of each month (UTC); the daily allowance refreshes each day
Unknown results are free — they never count against either allowance
Your plan's number is a FREE ALLOWANCE, not a ceiling: one-time verification credit packs verify beyond it. Purchased credits never expire, skip the daily pace, and are used automatically only once your free allowance is spent — so you can always clear a big list today without changing plans
How It Works: The verifier asks the receiving mail server whether an address can accept mail — without ever sending an email to it. Nobody is contacted, nothing arrives in anyone's inbox, and the check never runs through your own connected mailboxes, so your sender reputation is never put at risk to test a list.
What each check establishes: 1. Whether the address is written in a usable form 2. Whether the company can receive mail at all 3. Whether that specific mailbox exists and accepts mail 4. Whether the company accepts every address (a catch-all — see below), which means no tool can confirm one specific inbox there 5. Whether we already have first-hand proof: if your own mail has reached that inbox before, that real delivery is stronger evidence than any live check, and we use it instead. Results confirmed this way are marked 'Real delivery' in your results.
Most addresses come back in a second or two. Larger lists are paced deliberately rather than checked all at once — that pacing is part of what keeps the answers accurate.
Important: verification tells you an address is good AT THE MOMENT IT WAS CHECKED. It is not a permanent guarantee — people leave companies and mailboxes get closed. See 'Why a verified list can still bounce' below.
Accessing the Email Verifier: Navigate to Email > Email Verifier in the sidebar (look for the green 'New' badge). You'll see three tabs:
--- Tab 1: Batch Verification (CSV Upload) --- Verify a list of email addresses from a CSV file.
How to use: 1. Click 'Upload CSV' and select your file 2. The system automatically detects the email column (supported headers: email, email_address, e-mail, contact_email, emailaddress) 3. If no header matches, the system checks each column for email-formatted values 4. Emails are deduplicated, validated, and sanitized before processing 5. Verification processes gradually in the background (not all at once) to ensure accuracy and avoid rate limits 6. Monitor progress with the real-time progress bar — the page auto-refreshes every 3 seconds 7. View results filtered by status (All, Valid, Invalid, Risky, Unknown) 8. Download the complete results as a CSV when finished
CSV Requirements:
File must contain an 'email' column (or similar header name)
Maximum 20,000 emails per file — split a larger list into several files and upload them one at a time; every one lands in the same place
Maximum 10MB file size
Supports: quoted fields with commas (RFC 4180), UTF-8 with BOM (Excel exports), Windows/Mac/Unix line endings
Duplicate emails within the file are automatically removed
--- Tab 2: Verify a List --- Verify emails directly from your existing prospect lists — no CSV export/import needed.
How to use: 1. Select a prospect list from the dropdown 2. Click 'Verify List' 3. The system extracts all email addresses from the list's prospects (skips prospects without emails and LinkedIn-only placeholders) 4. Verification runs in the background with real-time progress 5. When complete, two things happen automatically: a) A NEW list called '[Your List Name] - Verified' is created containing only prospects with valid or risky emails b) Prospects with invalid emails are automatically marked 'invalid' across your contact database, so every campaign skips them from then on 6. The verified list appears in your Prospects page ready to use in campaigns
This is the recommended workflow before launching any campaign: 1. Import your prospects into a list 2. Go to Email Verifier > Verify a List 3. Select the list and verify 4. Use the auto-created '[Name] - Verified' list in your campaign
--- Tab 3: Single Check --- Verify a single email address instantly.
How to use: 1. Enter an email address in the input field 2. Click 'Verify' or press Enter 3. See instant results: status, MX host, catch-all detection, and response time 4. Rate limited to 20 verifications per minute per workspace
Verification Statuses:
Valid — The email address exists and can receive mail. Safe to send. Shown with a green badge.
Invalid — The email address does not exist, the mailbox is full, the domain has no mail server, or it's a known disposable email. Do not send. Shown with a red badge.
Risky — The domain is a 'catch-all' that accepts all addresses (e.g., small companies using Google Workspace catch-all). The email probably works but cannot be confirmed. Send with caution. Shown with a yellow badge.
Unknown — The mail server temporarily refused the check (greylisting, rate limiting, or server timeout). Not invalid — try again later. Shown with a gray badge.
Catch-All Domains Explained: Some domains are configured to accept emails sent to any address (e.g., [email protected] works). When the verifier detects this, it marks the email as 'risky' because it cannot confirm the specific mailbox exists. About 15-20% of B2B domains are catch-all. These emails are usually deliverable, but bounces are possible.
Batch Management:
All your verification batches are listed in the left panel with status indicators
Click any batch to see detailed results on the right
Filter results by status using the filter buttons
Download completed batches as CSV (available for 1 day after completion)
Cancel in-progress batches — pending verifications are stopped immediately
Your monthly usage is shown in the page header ('X / Y used this month')
Monthly Usage:
Displayed in the header as a badge: 'X / Y used this month'
Counts all emails submitted for verification (CSV uploads + list verifications)
Resets on the 1st of each month (UTC)
If you use up the free allowance, you'll see a clear message showing your usage — add verification credits to carry straight on (they never expire and skip the daily pace), or wait for the allowance to refresh
Single email checks are rate-limited separately (20/min) but do not count against the monthly limit
Prospect Limits by Plan: Each plan has a maximum number of prospects you can store: • Pro: 10,000 prospects • Enterprise: 100,000 prospects • Ultimate: 300,000 prospects • Existing prospects are never deleted on plan changes — you just cannot add new ones if you're over the limit
Data Retention:
Verification results CSV files are stored for 1 day, then automatically deleted
Batch records and individual results remain in the database indefinitely for your reference
Verified prospect lists (created from 'Verify a List') are permanent and behave like any other prospect list
Best Practices:
Always verify email lists before launching a campaign — this is the single most effective way to prevent high bounce rates
Use 'Verify a List' instead of CSV upload when your contacts are already in WarmySender — it's faster and automatically creates a clean list
Remove or exclude invalid addresses before sending — the 'Verify a List' feature does this automatically
Re-verify lists that are more than 30 days old, as email addresses can become invalid over time
Use the verifier after importing from external sources (purchased lists, scraped data, etc.)
Combine with Bounce Shield for maximum deliverability protection
For catch-all domains (marked as 'risky'), the email likely exists but cannot be confirmed — include them in campaigns but monitor bounce rates
Start with a small test batch if you're verifying a large purchased list — check the valid rate before committing your full monthly quota
FAQ: Q: Does the verifier send any emails? A: No. It asks the receiving mail server whether the address can accept mail and stops there — no message is ever delivered, and the person is never contacted.
Q: Will verification affect my sender reputation? A: No. Checks run on our own separate infrastructure, never through your connected mailboxes, so nothing you verify touches your sending reputation.
Q: Why are some results 'Unknown'? A: Some mail servers temporarily refuse verification attempts (greylisting, rate limiting). This does not mean the email is invalid. Try again later or include them in your campaign with caution.
Q: What happens to invalid prospects when I use 'Verify a List'? A: They are automatically marked with status 'invalid' in your prospect database. They remain in the original list but will be skipped by campaigns that filter by status.
Q: Can I re-verify the same list? A: Yes. Each verification creates a new batch and a new verified list. This is useful for re-checking lists after 30+ days.
Q: Do single email checks count toward my monthly limit? A: No. Single checks have a separate rate limit (20/minute) but do not deduct from your monthly verification quota.
There are three ways to get email addresses for your contacts in WarmySender — and one thing we deliberately do NOT do.
1) The Leads Database (find new contacts) • Go to Leads in the sidebar and filter by location, job title, seniority, department, and more • Searching, filtering, and paging are always FREE — nothing is spent for looking • Email addresses show masked in the results. Saving a lead to a list reveals the full address — that is the moment one lead is spent • Your plan includes a monthly allowance, spread evenly across the month so a fresh share is available every day (roughly your monthly number ÷ 30). This keeps good leads coming all month instead of draining in one sitting • Re-saving someone you already have is always free
2) Import a list you already have (CSV) • Go to Contacts and import a spreadsheet with an email column • This is the fastest route when you already own the data — an exported CRM list, a partner list, or a list you built elsewhere • Any extra column becomes a personalization field you can use in your emails
3) Verify before you send (Email Verifier) • The verifier CHECKS addresses you already have — it confirms an address can receive mail so you avoid bounces • It does not find or guess new addresses • Run it on a list before a first send; bounces are what damage a sender's reputation
What about contacts imported from LinkedIn? LinkedIn profiles do not carry a public email address, so contacts imported from a LinkedIn audience arrive WITHOUT one. That is expected, not an error. Those contacts can still run in a LinkedIn campaign (connection requests and messages need no email at all). If you want to email them too, match them up using one of the three routes above.
Why there is no per-profile 'find this person's email' button We do not offer a lookup that invents an address for an arbitrary profile. Tools that do this typically guess a pattern ([email protected]) and hope it lands. Those guesses bounce, and bounces cost far more than the missing feature — they damage the sending reputation you spent weeks warming up. We would rather give you addresses that are real: from the leads database, or from data you already trust.
Quick answers: Q: I imported prospects but they have no email addresses. What now? A: If they came from LinkedIn, that is expected — LinkedIn does not expose emails. Run them in a LinkedIn campaign, or find them in the Leads Database, or import a CSV that includes their addresses.
Q: Searching leads did not cost me anything. When am I charged? A: Only when you save (or export) a NEW lead — that is when the address is revealed. Browsing and re-saving are free.
Q: Can the Email Verifier find missing addresses? A: No. It checks addresses you already have so you do not send to a dead mailbox. Use the Leads Database or a CSV import to get addresses in the first place.
Q: I ran out for today. What are my options? A: A fresh share of your monthly allowance unlocks each day. If you need to keep going right now, one-time lead credits never expire and skip the daily pace.
Short answer: verification tells you an address was good AT THE MOMENT IT WAS CHECKED. It is a snapshot, not a permanent guarantee. Even a perfectly clean list will bounce a small number of addresses, and that is normal rather than a sign something went wrong.
This page explains why that happens, what each result actually means, and what to do about each one.
Why a Verified Address Can Still Bounce:
People leave. Someone verified on the 1st may have left the company by the 20th, and their mailbox is closed the day IT gets around to it.
Mailboxes get retired. Role addresses (info@, sales@, a departing employee's address) get switched off with no warning and no public signal.
Companies change email providers. During a migration a domain can accept mail one day and reject it the next.
Mailboxes fill up. A full mailbox rejects new mail until someone clears space, even though the address is perfectly real.
Some servers only decide at delivery time. A company can accept every address when asked and then reject some of them later, once the message actually arrives. No verification tool anywhere can see past that — see catch-all below.
Filters can reject on content, not on the address. That is a deliverability outcome, not a bad address, and it is what warmup exists to improve.
How Much Bouncing Is Normal: On a freshly verified list, a small residue of bounces is expected. What matters is the trend, not a single bounce. If a campaign is bouncing heavily — far beyond a few stragglers — the cause is usually one of these, in order of likelihood: 1. The list is old. Business contact data goes stale surprisingly fast; a list verified months ago is a different list today. 2. The list was bought or scraped. Purchased lists are frequently full of addresses that were never real, and re-verifying only tells you they are still not real. 3. The list is mostly catch-all domains, which were never confirmable in the first place (see below). 4. Sending was scaled up faster than the mailbox was warmed up.
How Long Does a Verification Stay Accurate? There is no expiry date, but freshness matters. As a practical rule: verify immediately before a campaign rather than months ahead, and re-verify any list older than about 30 days before reusing it. Verifying a list and then sitting on it for a quarter gives you the accuracy of a quarter-old list, not a verified one.
What 'Risky' or 'Catch-All' Really Means: Some companies accept mail addressed to ANY name at their domain — real or not — and only work out afterwards whether the recipient exists. These are called catch-all domains, and roughly 15-20% of business domains are set up this way.
When we ask such a domain about an address, it says yes to everything. That yes proves nothing, so we mark the result 'risky' rather than pretending it is confirmed. This is a property of the RECEIVING company's mail setup — it is not a fault in your list, and no verification service on the market can confirm an individual mailbox behind a catch-all.
What to do with them: most catch-all addresses are perfectly deliverable, so removing them all throws away real prospects. Send to them gradually, keep warmup running, and watch how they perform. If your bounces are concentrated in catch-all addresses, ease off that segment.
What 'Unknown' Means (And Why It's Free): 'Unknown' means we could not get a definitive answer — some mail providers decline to answer questions about their addresses at all, and some ask us to come back later.
Unknown does NOT mean invalid. It means undetermined.
Because it would be unfair to charge for an answer we did not get, unknown results are FREE. They never count against your monthly allowance or your credits.
What to do with them: treat them as unproven rather than bad. Re-check them later — a provider that declined once often answers later — or include them cautiously with warmup running.
What Each Result Means and What To Do:
Valid — Confirmed deliverable. Send with confidence.
Invalid — Confirmed undeliverable. Remove these; they are the ones that would have bounced. This is the single biggest win verification gives you.
Risky (catch-all) — Could not be confirmed because the receiving company accepts every address. Usually deliverable. Send gradually with warmup on.
Unknown — No definitive answer, and not charged. Re-check later or send cautiously.
Couldn't check — Our check did not complete. Nothing is wrong with the address; try it again in a few minutes. Also free.
The Strongest Result We Can Give You: When your own mail has already reached an inbox, we know that address is real from first-hand experience rather than from asking. Those results are marked 'Real delivery' in your results and in your exported file. That is stronger evidence than any live check, because it already happened.
How to Keep Bounces Low: 1. Verify right before you send, not months ahead. 2. Remove every 'invalid' — that is the main job verification does for you. 3. Re-verify any list older than about 30 days. 4. Keep warmup running on every sending mailbox; it is what builds the reputation that keeps mail landing. 5. Ramp new mailboxes up gradually instead of sending a large batch on day one. 6. Treat catch-all and unknown addresses as a separate, slower segment. 7. Be sceptical of purchased lists — verification reveals how bad one is, but it cannot repair it.
FAQ: Q: I verified my list, so why did some emails still bounce? A: Verification is accurate at the moment of checking, not forever. People leave companies, mailboxes get closed, and mailboxes fill up — all after a check has passed. A small number of bounces on a freshly verified list is normal.
Q: Does a bounce mean the verification was wrong? A: Usually not. It much more often means the address stopped working between the check and the send, or that it was a catch-all address that could never be confirmed in the first place.
Q: Should I delete every 'risky' address? A: No. Risky means the receiving company accepts every address, so we could not confirm that one specific inbox. Most are deliverable. Send to them gradually with warmup running instead of discarding real prospects.
Q: Was I charged for 'unknown' results? A: No. Unknown results are always free and never count against your monthly allowance or your credits. You are only charged when we can confirm an answer.
Q: How often should I re-verify a list? A: Re-verify anything older than about 30 days, and always verify immediately before a campaign rather than well in advance.
Q: Can any tool guarantee zero bounces? A: No, and any tool claiming to can't deliver it. Verification removes the addresses that are already dead, which is the large majority of avoidable bounces — but no service can see a mailbox that gets closed tomorrow, and no service can confirm an individual inbox behind a catch-all domain.
Clean data is the foundation of successful outreach. Poor data quality causes bounces, spam complaints, and reputation damage.
Why Data Hygiene Matters:
Bounce rates above 3% damage your sender reputation.
Invalid emails waste your daily sending quota.
Outdated contacts result in spam complaints (people at new companies).
Duplicate records cause embarrassing double-sends.
Before Importing (Pre-Import Cleaning):
Remove obvious junk — blank rows, test entries, personal emails (gmail.com, yahoo.com for B2B campaigns).
Standardize formatting — consistent name capitalization, remove extra spaces.
Verify email format — every email must contain @ and a valid domain.
Remove role-based emails — info@, sales@, support@, admin@ have high bounce and complaint rates.
Check for suppressed domains — remove emails from domains on your blocklist.
Using WarmySender's Built-in Tools:
Email Verifier — Verify all imported emails before sending. Status: Valid, Invalid, Risky, Unknown.
MX Validation — During import, emails with invalid domain DNS are automatically flagged.
Deduplication — Import automatically skips duplicates (by email within your workspace).
Suppression List — Matches against your blocklist during import.
Ongoing Maintenance:
Re-verify lists older than 30 days — email addresses go stale at ~2% per month.
Review bounced contacts monthly — remove or re-verify them.
Monitor your bounce rate in Analytics. If it exceeds 3%, clean your lists immediately.
Export your suppression list periodically and cross-reference with active prospect lists.
Remove prospects who have been contacted 3+ times with no engagement.
Bounce Shield Integration: Enable Bounce Shield in Settings to automatically: • Pause campaigns when bounce rates exceed your threshold. • Add bounced addresses to your suppression list. • Alert you via email when issues are detected.
Best Practices:
Verify before you send — always. It costs far less than reputation damage.
Custom fields let you store additional prospect data beyond the built-in fields and use them for personalization.
How Custom Fields Work: When you import a CSV with columns that do not match built-in field names (email, firstName, lastName, company, role, phone, linkedinUrl, website, country, city, industry), they are stored as custom fields.
Creating Custom Fields: 1) Add extra columns to your CSV with a 'custom:' prefix header: custom:department, custom:pain_point, custom:referral_source, custom:product_interest 2) During import, these columns are automatically detected and stored. 3) Field names are sanitized: lowercased, non-alphanumeric characters replaced with underscores, max 30 characters.
Using Custom Fields in Emails:
Reference them with the custom prefix: {{custom.department}}, {{custom.pain_point}}, {{custom.referral_source}}
The bare shorthand also works: {{department}}, {{pain_point}} (as long as it doesn't conflict with a built-in field name)
Use with fallback values, written either way (both do the same thing): {{custom.pain_point | default: 'scaling your outreach'}} or the shorthand {{custom.pain_point || 'scaling your outreach'}}. The fallback fills in only when that field is blank for a prospect — ideal for a column that's only partly filled. Quotes are optional in the shorthand: {{custom.state || Brazil}} works too.
Combine with built-in tags: 'Hi {{firstName}}, as head of {{custom.department}} at {{company}}...'
Adding or Updating Custom Fields Later (Re-Upload to Fill in the Blanks): You can enrich existing contacts anytime by uploading again — you don't have to get every column right on the first import. • Upload a file with the same people (matched by email address) plus new or updated custom columns, and those fields are ADDED to the contacts you already have. Nothing you had before is lost. • A blank cell never erases an existing value. If your new file leaves a column empty for someone who already has a value there, their existing value is kept. Only real, filled-in values are written. • The contacts in that upload are also added to whichever list you're importing into — even the ones that were already in your account — so your target list ends up complete. • This is the fix for the common case of "I imported a personalized column later and it didn't show up." Just upload the list one more time with the column filled in, and it fills in on the existing contacts.
Popular Custom Field Ideas:
Pain point — Pre-research their specific challenge.
Mutual connection — 'We both know {{mutual_connection}}'.
WarmySender uses first-touch attribution for all campaign revenue reporting on the admin dashboard.
When you click a link to WarmySender — from an ad, an email, a social post, or a referral — we record the source the very first time you arrive at the site. That first source stays with your account for 90 days, even if you leave and come back.
Concretely:
First click: You land on warmysender.com from Campaign A. We set a secure, http-only cookie (named ws_attrib) that records Campaign A as your source. The cookie is host-scoped, sameSite=lax, and lasts 90 days.
Later visits: You leave, then come back days or weeks later from a different ad (Campaign B). We do NOT overwrite Campaign A — the first signal wins. Campaign B is recorded as a separate "paid-touch" signal but does not move revenue between buckets.
Signup and payment: Whenever you eventually sign up (email magic-link, Google sign-in, or Apple sign-in) and pay, the revenue is attributed to Campaign A on /admin/stats.
Why first-touch? It tells us which campaigns introduce customers to the product, which is what marketing budget actually paid for. Last-touch attribution rewards retargeting (which often just shows the ad to someone who already decided to buy), while first-touch rewards genuine acquisition.
How we keep this evergreen across signup paths:
All three signup paths — email magic-link, Google OAuth, and Apple OAuth — read the same first-touch ws_attrib cookie and persist the captured UTM source/medium/campaign to the user record at signup. The cookie always wins over per-click signals (OAuth state, request body, URL params), because per-click signals are latest-touch leaks by definition. If the cookie is missing (private browsing, ad blocker, old browser without cookies), we fall back to the URL parameters at click time. Attribution data is never silently overwritten on a return visit.
What's tracked:
The first-touch capture includes utm_source, utm_medium, utm_campaign, gclid (Google Ads), fbclid (Meta Ads), the original referrer URL, and the timestamp of first touch. Google Ads gclid auto-derives to (google, cpc) if no explicit UTM is set; Meta fbclid auto-derives to (facebook, paid_social).
First-touch vs paid-touch:
We also record a separate paid_utm_source/medium/campaign snapshot at the moment of first checkout. Both signals are kept on the user record:
signup_utm_* — the campaign that introduced the user (first-touch, used for revenue attribution)
paid_utm_* — the most recent campaign before purchase (last-touch, kept for divergence analysis only)
The admin dashboard surfaces an "Attribution Health" panel showing coverage percentage, paid users without attribution, and the first-touch≠paid-touch divergence rate so we can monitor the integrity of the data over time.
Warmup — Active mailboxes, average success rate, emails warmed today, average health score. Per-mailbox status table with level badge, daily progress, success rate.
Date Range: 7 days, 14 days, 30 days (default), 90 days. Channel Filter: All / Email / LinkedIn. CSV Export: Download analytics data as CSV for external analysis.
Key Benchmarks:
Open Rate: Aim for 40%+ (below 20% = improve subject lines)
WarmySender supports multi-user workspaces for team collaboration:
What is a Workspace? • A workspace is an isolated environment containing its own mailboxes, campaigns, prospects, templates, analytics, and settings • When you sign up, one workspace is automatically created for your account • Your subscription plan (Pro, Enterprise, Ultimate) covers your entire account — all workspaces you own share your plan's email quota • LinkedIn seats are billed separately per workspace ($15/seat/month per workspace; seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price)
Multiple Workspaces:
Enterprise plan: Up to 5 workspaces
Ultimate plan: Up to 10 workspaces
Pro plan: 1 workspace (upgrade to Enterprise for more)
Each workspace is completely isolated: separate mailboxes, campaigns, prospects, LinkedIn accounts, templates, and analytics
Your plan's monthly email quota (e.g., 10,000/month on Pro) is shared across all workspaces you own
LinkedIn seats are per-workspace — each workspace that uses LinkedIn needs its own seats
Use the workspace switcher in the sidebar to switch between your workspaces
Creating Additional Workspaces (Enterprise & Ultimate): 1) Click the workspace switcher in the sidebar 2) Click 'Create Workspace' at the bottom of the dropdown 3) Enter a name for your new workspace 4) Your new workspace is created and becomes your active workspace • Each additional workspace starts empty — connect mailboxes, import prospects, and set up campaigns separately • No extra charge — additional workspaces are included with your Enterprise or Ultimate plan • Pro users: Upgrade to Enterprise ($69.99/month) to unlock multiple workspaces
Roles & Permissions:
Owner — Full access including billing and workspace deletion. Cannot be removed.
Admin — Manage mailboxes, campaigns, members. Access all features except billing.
User — Create campaigns, manage prospects, view analytics. Shown as 'Member' in the workspace switcher.
Readonly — View-only access. Cannot modify any data. Shown as 'Viewer' in the workspace switcher.
Team Member Limits by Plan:
Free / Lite: 1 member
Pro: 2 members (owner + 1 invited)
Enterprise: 4 members (owner + 3 invited)
Dominate / Rampage (legacy): Unlimited
Inviting Team Members:
Go to Settings > Team tab
Click 'Invite' (disabled when at plan limit — pending invites count toward limit)
Enter the invitee's email address and select a role (Admin or User)
They receive an email with a secure invitation link
They click the link, log in (or create an account), and accept the invitation
They're added to your workspace with the assigned role
Pending Invitations:
Visible in the Team tab with email, role, expiry date, and inviter
Can be canceled before acceptance
Invitations have an expiry period
Workspace Switching:
If you belong to multiple workspaces, use the workspace switcher in the sidebar
Click on a workspace name to switch — all data (mailboxes, campaigns, prospects, etc.) switches to that workspace
Each workspace has independent data and settings
Shared Resources:
All team members share mailboxes, campaigns, prospects, templates, and analytics within a workspace
If you downgrade to a plan with fewer workspace slots (e.g., Enterprise to Pro), your existing workspaces are NOT deleted
You keep full access to all existing workspaces — you can still switch between them, run campaigns, and manage data
You simply cannot create new workspaces beyond your new plan's limit
All workspaces will operate under your new plan's sending limits (e.g., Pro's 10,000 emails/month shared across all workspaces)
Mailboxes vs. Team Members (Important Distinction):
Mailboxes are email accounts you connect (e.g., [email protected], [email protected]). Connected mailbox limits depend on tier: Pro 50 / Enterprise 400 / Ultimate 800.
Team members are people who log in to your workspace to manage campaigns. Each member gets their own login and role.
Connecting a mailbox does NOT require a team member seat. A single workspace owner can connect and manage 10, 50, or hundreds of mailboxes alone — no additional seats needed.
Example: You have 6 domains with 3 email accounts each (18 mailboxes total). You can connect all 18 to one workspace on the Pro plan ($14.99/month) and manage them yourself — no team members required.
Team member seats are only needed when other people need their own login to help manage your workspace.
Common Use Cases for Multiple Workspaces:
Agency managing outreach for multiple clients — one workspace per client
Business with multiple brands or product lines
Separating sales outreach from partnership outreach
Keeping test/sandbox campaigns separate from production
Pro — $14.99/month (10,000 emails/month, 2 team members, 1,000 leads credits/month)
Enterprise — $69.99/month (100,000 emails/month, 4 team members, 15,000 leads/month)
Ultimate — $199/month (300,000 emails/month, 15 team members, 30,000 leads/month)
Annual Billing (save 55% — limited time):
Pro — $6.74/month ($80.88/year)
Enterprise — $31.49/month ($377.88/year)
Ultimate — $89.55/month ($1,074.60/year)
Toggle between monthly and annual on the Billing page
How the limited-time 55% annual offer works:
The 55% discount is evergreen but framed with a real end-of-month deadline that resets monthly — the date you see is the actual end of this calendar month UTC, but the discount itself does not actually disappear when the date hits.
Customers already on a previous annual rate keep their original price — they are grandfathered at the rate they signed up for.
Promo codes can stack on top of the 55% (a 10% off code at checkout makes the total ~59.5% off list).
LinkedIn seats are billed separately — $15/seat/month, or $120/seat/year (33% off) on annual billing (seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price).
Requires an active paid subscription (any paid plan)
Available as an add-on at $15/month per seat, or $120/seat/year (33% off) on annual billing (seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price)
Each seat allows one connected LinkedIn account
Minimum 1, maximum 10 seats per workspace
Manage seats from the Billing page (add, reduce, or cancel)
Can be bundled with a plan during initial checkout
Multi-account sender rotation across your connected LinkedIn accounts (so each lead is contacted by only one account) is included on every paid plan — Pro and up. Just add a seat for each LinkedIn account you want to use.
Important: If your main subscription is canceled or becomes inactive, all LinkedIn accounts will be disconnected and LinkedIn campaigns will be paused. Canceling only the LinkedIn add-on does NOT affect your email plan.
Billing with Multiple Workspaces:
Your subscription (Pro, Enterprise, or Ultimate) is account-level — it covers all workspaces you own
Your monthly email quota is shared across all your workspaces (e.g., 10,000 emails/month on Pro is the total across all workspaces)
LinkedIn seats are billed separately per workspace — each workspace that uses LinkedIn needs its own seat subscription
Team member limits apply per workspace (e.g., Pro allows 2 members per workspace, Ultimate allows 15)
Enterprise/Ultimate: Create additional workspaces from the workspace switcher — no extra subscription charge
Billing Management:
Upgrade or downgrade anytime — changes take effect immediately
Payment processed securely via Stripe
View billing history and download invoices
Update payment method
Cancel subscription (access continues until period end)
For refund requests, see our Refund Policy at /refund-policy
Subscription Statuses:
Active — Paid and current
Past Due — Payment failed (soft warning)
Canceled — Will end at period end
Inactive — Subscription ended (restricted to billing page only)
When your subscription becomes inactive, active campaigns are automatically paused. They auto-resume when you re-subscribe.
Suppression lists prevent emails from being sent to specific addresses or domains:
Managing Your Blocklist: 1) Go to Settings > Blocklist tab 2) Add entries by type: • Email suppression — Block a specific email address (e.g., [email protected]) • Domain suppression — Block an entire domain (e.g., competitor.com blocks all @competitor.com addresses) 3) Each entry can have an optional reason for tracking
Three ways to suppress people:
One at a time — add a single email address or domain from Settings > Blocklist.
A whole list at once — Settings > Blocklist > Import CSV, upload a file with type,value,reason columns (or simple email / domain columns); WarmySender de-duplicates and validates it, shows a preview, and adds the new entries. Best for a long external list of addresses or domains.
Straight from your contacts — on the Prospects page, tick the people you want (or 'Select all' to grab a whole filtered segment) and choose the 'Suppress' bulk action. They're added to the blocklist and skipped by every campaign right away. Fastest when the people are already in your account. See 'Managing Prospects & Contacts' for the full steps.
Automatic Suppression:
Bounced emails are auto-added (source: 'bounce')
Unsubscribed prospects are auto-added (source: 'unsubscribe')
Spam complaints are auto-added (source: 'complaint')
Manual entries show source: 'manual'
Enforcement:
During CSV import: any email matching a suppression entry is automatically skipped and counted as 'suppressed'
During campaign sending: suppressed prospects are blocked from receiving emails
Domain-level suppression matches all emails at that domain
Case-insensitive matching
CAN-SPAM Compliance:
Every campaign email includes an unsubscribe link in the footer
RFC-compliant List-Unsubscribe and List-Unsubscribe-Post headers
Unsubscribe requests are processed immediately
Physical address should be included in your email footer
GDPR Compliance:
Respect opt-out requests promptly
Maintain your suppression list as your 'do not contact' registry
Consider adding a privacy policy link to your email footer
Data access and deletion requests should be handled through your workspace settings
Best Practice: Regularly review and clean your suppression list. Add competitor domains, existing customer domains, and known bad addresses proactively.
Email authentication records are DNS settings that prove you are authorized to send email from your domain. Setting up all three is critical for inbox placement.
SPF (Sender Policy Framework):
Specifies which mail servers can send email on behalf of your domain
DNS record type: TXT record on your root domain
Example: v=spf1 include:_spf.google.com ~all
Check with your email provider for the correct 'include' value
DKIM (DomainKeys Identified Mail):
Adds a cryptographic signature to your emails to verify they haven't been tampered with
DNS record type: TXT or CNAME record (provider-specific subdomain)
Your email provider generates the DKIM key — check their documentation
Set up a custom tracking domain for better email deliverability:
Why Custom Tracking Domains:
By default, the open/click tracking and unsubscribe links in your cold emails use WarmySender's shared domain
A custom domain (e.g., track.yourdomain.com) improves deliverability because the tracking links match your sending domain
Email providers are less likely to flag emails with matching domains as suspicious
Setup Steps: 1) Go to Settings > Tracking Domains 2) Click 'Add Domain' and enter your tracking subdomain (e.g., track.yourdomain.com) 3) The system shows the CNAME target you need to add: track.warmysender.com 4) Go to your DNS provider and create a CNAME record: - Name/Host: track (or your chosen subdomain) - Value/Target: track.warmysender.com - TTL: 3600 (or default) 5) Wait for DNS propagation (can take up to 48 hours, usually faster) 6) Click 'Verify' in WarmySender. Verification confirms your domain is fully live — that it resolves AND securely serves your tracking links end to end — not just that the DNS record exists.
Status Values:
Pending — added but not yet confirmed live
Verified — confirmed live; your campaigns now use your domain for open/click/unsubscribe links
Error — the domain isn't resolving or serving correctly yet (fix the CNAME and re-verify)
Automatic fallback (your sends are always safe): once a domain is Verified, WarmySender keeps checking that it stays healthy. If a custom domain is ever removed, or its DNS changes and it stops working, your campaigns automatically fall back to our default domain and keep sending without interruption — a broken tracking domain can never stop your emails from going out.
You can set up multiple tracking domains. Tracking domains are managed per workspace.
Best Practice: Use a subdomain of your sending domain (e.g., if you send from @acme.com, use track.acme.com).
Full step-by-step walkthrough with a worked example and FAQ: see 'How to use your own tracking domain' at /documentation/how-to-use-your-own-tracking-domain.
A custom tracking domain lets the open, click, and unsubscribe links inside your cold emails use your OWN domain (like track.yourdomain.com) instead of the shared WarmySender domain. This guide walks you through what it is, why it helps your emails land in the inbox, the one DNS change you need to make, how to verify it, and what happens if it's ever unset or broken.
What a tracking domain is:
Every cold email you send can include invisible tracking so you can see who opened and who clicked, plus a one-click unsubscribe link. Those links have to live on a web address. By default that web address is a domain shared by many WarmySender customers. A custom tracking domain swaps in a small subdomain of your own — for example track.yourdomain.com — so the links in your emails match the domain you send from.
Why it improves deliverability:
Mailbox providers (Gmail, Outlook, and others) look at whether the links in an email line up with the domain that sent it. When your sending domain is acme.com and your tracking links are on a shared, unrelated domain, that mismatch is a small negative signal. When your tracking links are on track.acme.com — clearly part of your own domain — everything matches, which looks more trustworthy and helps your emails reach the inbox instead of spam. It also means your recipients only ever see your brand in the links, not a shared domain.
The one DNS step (add a CNAME): 1) In WarmySender, go to Settings > Tracking Domains and click 'Add Domain'. 2) Enter the subdomain you want to use — we recommend a 'track' subdomain of your sending domain, e.g. track.yourdomain.com. 3) WarmySender shows you the CNAME target to point at: track.warmysender.com. 4) Log in to wherever your domain's DNS is managed (for example Cloudflare, GoDaddy, Namecheap, Google Domains, or Route 53) and add ONE new CNAME record: • Type: CNAME • Name / Host: track (just the subdomain part — most DNS providers add the rest of your domain automatically) • Value / Target / Points to: track.warmysender.com • TTL: leave it on Automatic or 3600 5) Save the record. DNS changes usually take a few minutes but can take up to 48 hours to fully spread.
How to verify:
Back in Settings > Tracking Domains, click 'Verify' next to your domain. WarmySender confirms your domain is genuinely live end to end — that the CNAME is pointing to the right place AND that your domain securely serves your tracking links — not just that a DNS record exists. When it succeeds, the status turns to Verified and, from that point on, your campaigns automatically use your domain for open, click, and unsubscribe links. If it isn't ready yet, the status shows Error or Pending — double-check the CNAME name and target, give DNS a little more time, and click Verify again.
Status meanings:
Pending — added, but we haven't confirmed it's live yet.
Verified — confirmed live; your campaigns are now using your domain for tracking links.
Error — the domain isn't resolving or serving correctly yet. Re-check the CNAME and re-verify.
If it's ever unset or stops working, your sends keep running:
This is the important safety net. Once your domain is Verified, WarmySender keeps quietly checking that it stays healthy. If you remove the custom domain, or its DNS is later changed or deleted so it stops working, WarmySender automatically falls back to our default domain for your tracking links and your campaigns keep sending without a hitch. A broken or removed tracking domain can never stop your emails from going out — the worst case is simply that tracking links temporarily use our default domain again until you fix yours.
Worked example (acme.com): Say you send from [email protected] and want branded tracking. 1) Settings > Tracking Domains > Add Domain > enter track.acme.com. 2) WarmySender shows the target: track.warmysender.com. 3) In your DNS provider, add: CNAME, Name = track, Value = track.warmysender.com, TTL Automatic. 4) Wait a few minutes, then click Verify. Status turns Verified. 5) Your next campaign's open/click/unsubscribe links now read like track.acme.com — matching your sending domain. If you ever delete that CNAME, campaigns quietly revert to the default domain and keep sending.
Good to know:
Use a subdomain of the domain you actually send from — track.acme.com if you send from @acme.com — so everything matches.
You can add more than one tracking domain; they're managed per workspace.
You do not need a custom tracking domain to send — it's an optional deliverability upgrade. Without one, tracking simply uses our default domain (this is fine and safe).
A tracking domain is separate from your SPF, DKIM, and DMARC records — those authenticate your mail and are also worth setting up (see the Email Deliverability guide).
Frequently asked questions:
Do I need a custom tracking domain to send cold emails? No. It's an optional upgrade for deliverability and branding. Without one, your open/click/unsubscribe links use our shared default domain, which works fine.
What exactly do I add at my DNS provider? Exactly one CNAME record: Name/Host = track (or whatever subdomain you chose), Value/Target = track.warmysender.com, TTL Automatic or 3600. Nothing else.
Why does my domain still show Pending or Error after I added the record? DNS can take up to 48 hours to spread, though it's usually much faster. Confirm the Name is just the subdomain (track) and the Value is exactly track.warmysender.com with no extra characters, then click Verify again.
What happens if I delete the domain or its DNS later breaks? Your campaigns keep sending. WarmySender automatically falls back to our default domain for tracking links the moment a custom domain is removed or stops working, so a broken tracking domain can never interrupt your sending.
Will switching to a custom tracking domain change my past open and click numbers? No. It only affects links in emails sent from that point forward. Your existing stats stay exactly as they are.
Can I use one tracking domain across several campaigns? Yes. Once a domain is Verified in your workspace, all of that workspace's campaigns use it automatically.
Still stuck? Contact us at [email protected] with the domain you're setting up. For instant answers, you can also open warmysender.com/documentation, click 'Copy Prompt to Clipboard,' and paste it into an AI assistant like Claude or ChatGPT along with your question.
WarmySender monitors bounce rates across your recent sends
When the bounce rate within the configured window exceeds your threshold, Bounce Shield activates
If auto-pause is enabled, affected campaigns are paused to prevent further damage
If auto-blocklist is enabled, bounced addresses are added to your suppression list
You receive an email notification (if enabled)
This is in addition to the per-campaign safety metrics (5% bounce rate threshold with 50 minimum sends). Bounce Shield provides workspace-level protection across all campaigns.
Best Practice: Keep the default settings. Lower the threshold to 5% if you are very cautious about deliverability. Verify your email lists before importing to reduce bounces.
If Microsoft or Outlook is rejecting your email, the cause is almost always the reputation of the IP address your mail is SENT FROM — not your warmup. Email warmup does not block an IP, and it cannot unblock one either. Outlook.com and Office 365 decide whether to accept a message largely on what they know about the sending IP and the sending domain, so a hard rejection from Microsoft is a decision about the IP your mail left from, made before warmup ever enters the picture. This is one of the most common questions we get, and it usually is not a sign that you did anything wrong.
Why warmup is not the cause:
Warmup sends a small, gradually increasing number of messages to a network of real inboxes that genuinely open, reply to, and engage with them. It never sends in bulk to Microsoft on your behalf, and it cannot get an IP blocked. In fact it works in the opposite direction — over time it builds positive signals that improve how mailbox providers see your domain. If Microsoft has flagged the IP you send from, that flag came from the broader sending history on that IP, and warmup is simply delivering through it like every other message you send.
The usual real cause is a shared sending IP:
Many domains on web or cPanel shared hosting — for example Namecheap, Hostinger, or GoDaddy plans — send their outbound mail through an IP address shared with dozens or hundreds of other unrelated websites. You do not control that IP, and neither do the other tenants on it.
Microsoft is especially strict about shared hosting IP ranges, because the reputation of that IP is the SUM of everyone sending from it. If another website on the same IP sends spam or collects complaints, Microsoft can throttle or block the entire IP — and your perfectly clean mail gets caught in the same net, no matter how good your content or list is. The problem is not your sending; it is the IP your mail leaves from.
How to confirm it:
Read the exact bounce or error message Microsoft returns. A shared-IP block usually names the specific IP that was refused and links to a page explaining the reason and how to request a review. The exact wording varies, but a rejection of this kind generally reads like this generic example: "Your message could not be delivered. The sending IP address has been refused by the recipient's mail service because of its reputation. Please visit the listed support page to request a review." The pattern is consistent — it points at an IP, not at your warmup, your content, or your subject line. If that IP belongs to your hosting provider's shared server rather than an address you personally manage, you have your answer.
How to fix it, in priority order:
Send from a mailbox that has its own trusted reputation. This is the single most reliable fix. Connecting a Microsoft 365 or Google Workspace mailbox directly means your mail leaves through Microsoft's or Google's own carefully managed sending infrastructure instead of a shared web-hosting IP. See "Connect a Microsoft 365 Mailbox to WarmySender" for the steps.
If you want to keep your own domain's mail server, ask your hosting provider whether you are on a shared sending IP and whether a dedicated IP is available. A dedicated IP, or a reputable managed sending service, gives you reputation you actually control.
Make sure SPF, DKIM, and DMARC are correctly configured for your domain. These are necessary but not sufficient on their own — passing authentication does not override a blocked IP. See "Email Deliverability (SPF, DKIM, DMARC)" for setup help.
If the bounce includes a delisting or mitigation link, follow it and submit the request. On a shared IP you do not fully control the outcome, because the IP's reputation also depends on the other senders on it — which is why moving to a mailbox with its own reputation is the durable fix, not repeated removal requests.
What warmup can and cannot do:
Warmup CAN:
Build your domain and content reputation through real engagement.
Keep your mailbox active and looking human, which providers reward over time.
Improve inbox placement with providers that weigh sender engagement.
Warmup CANNOT:
Change the reputation of an IP you share with other senders — you do not control it, so warmup cannot fix it.
Force a provider that has blocked your sending IP to start accepting your mail.
A quick way to remember it: warmup builds the reputation of YOU — your domain and your sending behavior — but cannot rebuild the reputation of an IP shared with strangers. Pairing warmup with a mailbox that has its own trusted IP gives you both halves. To watch your domain's standing improve as warmup builds it, see "Domain Reputation Monitoring".
Still stuck? Contact us at [email protected] and include the exact bounce or error text you received — that message is the single most useful clue for pinpointing the cause. For instant answers, you can also open warmysender.com/documentation, click "Copy Prompt to Clipboard," and paste it into an AI assistant like Claude or ChatGPT along with your question.
WarmySender provides a REST API and webhook system for integrations:
API Keys (Settings > API Keys): 1) Click 'Create Key' and give it a name 2) Select scopes (permissions) for the key: • Prospects: read / write • Mailboxes: read / write • Warmup: read / write • Campaigns: read / write (create, update, start, pause) • Enrollments: write • Suppressions: read / write • Webhooks: read / write • Jobs: read 3) The full key is shown ONCE on creation — copy and save it securely 4) After creation, only the key prefix is stored (for identification)
Authentication:
Use the header: Authorization: Bearer YOUR_API_KEY
Keys are hashed with SHA-256 for storage security
Keys can have an expiration date
Revoke keys anytime from the API Keys tab
Webhooks (Settings > Webhooks): 1) Click 'Create Webhook' and enter your endpoint URL 2) Select which events to subscribe to: • reply.received — A prospect replied to a campaign email • email.bounced — An email hard-bounced • email.unsubscribed — A prospect clicked the unsubscribe link • email.opened — A prospect opened a campaign email • email.clicked — A prospect clicked a tracked link • prospect.suppressed — A prospect was added to the suppression list • limit.hit — A daily sending limit was reached 3) Each webhook gets a unique secret for signature verification 4) Test your endpoint with the 'Test' button
Webhook Delivery:
Events are delivered via HTTP POST to your endpoint
Signed with HMAC-SHA256 (X-Warmy-Signature header)
Failed deliveries are retried up to 10 times with exponential backoff
Delivery history is tracked per webhook
For full API reference, visit warmysender.com/docs/integrations
WarmySender includes guided tours to help you get started:
Main Onboarding Tour:
Automatically shown to new users after selecting a plan
Step-by-step walkthrough of the main features
Can be skipped at any time
Replay anytime from Settings > Account > Product Tour > 'Replay Onboarding Tour'
Page-Specific Tours:
First time visiting key pages (Campaigns, Mailboxes, etc.), a contextual tour explains that page's features
Each page tour is shown once and marked as completed
Reset all page tours from Settings > Account > Product Tour > 'Reset Page Tours'
Nurture Email Sequence: • New unpaid users receive a 5-day email sequence with tips: - Day 1: Welcome and inbox placement overview - Day 2: Quick win — set up 2 mailboxes - Day 3: Common mistakes to avoid - Day 4: Warmup → then launch workflow - Day 5: Final tips and encouragement • Sequence stops automatically when you upgrade to a paid plan • Sends daily at 8 AM PST
Best Practice: Complete the full onboarding tour to understand all features. If you feel lost at any point, replay the tour from Settings.
WarmySender takes security seriously. Here is an overview of our security practices:
Data Encryption:
All data in transit is encrypted using TLS 1.2+ (HTTPS). Every connection between your browser and our servers is encrypted.
Your WarmySender account has no password at all — you sign in with a single-use 6-digit code we email you, so there is no account password to steal, leak, or reuse anywhere else.
API keys are hashed with industry-standard algorithms; we never store them in readable form.
Database connections use SSL encryption.
Authentication & Access:
Passwordless sign-in with single-use emailed codes, and secure HTTP-only session cookies.
Two-factor authentication support for LinkedIn account connections.
API keys support granular scopes (read/write per resource type) and optional expiration dates.
Failed login attempts are rate-limited to prevent brute force attacks.
Infrastructure:
Application and database hosted on secure cloud infrastructure, with automatic backups and point-in-time recovery.
Internal service connections are encrypted.
Regular security updates and dependency patching.
Email Security:
SMTP connections support TLS/SSL encryption.
SSRF protection: the system validates that SMTP/IMAP hostnames do not resolve to private or internal IP addresses.
Port validation: only standard email ports are allowed.
Connection testing before accepting mailbox credentials.
Compliance:
CAN-SPAM: Every campaign email includes an unsubscribe link and respects opt-out requests immediately.
GDPR: Data processing with user consent, right to erasure via account deletion, suppression list management.
LinkedIn: All automation follows LinkedIn's Terms of Service with conservative rate limits, ramp-up periods, and circuit breakers.
Unsubscribe handling follows RFC 2369 and RFC 8058 standards.
Data Retention:
You control your data — export or delete at any time.
Campaign data and analytics are retained while your account is active.
Upon account deletion your access ends immediately and your data is deleted within 30 days, except for the small amount we are legally required to keep (such as billing records). See /documentation/cancel-or-delete-your-account.
Security Page: For our full security policy, visit warmysender.com/security. Privacy Policy: warmysender.com/privacy.
Set up webhooks to integrate WarmySender with your CRM and automation tools.
What Are Webhooks? Webhooks are real-time HTTP notifications sent from WarmySender to your endpoint whenever specific events occur (reply received, bounced, unsubscribed, etc.).
Setup (5 minutes):
Go to Settings > Webhooks.
Click 'Create Webhook'.
Enter your endpoint URL (where WarmySender sends the event data).
Select which events to subscribe to.
Copy the webhook secret for signature verification.
Click 'Test' to send a test event and verify your endpoint.
Available Events:
reply.received — Triggered when a prospect replies to a campaign email.
email.bounced — Triggered when an email hard-bounces.
email.unsubscribed — Triggered when a prospect clicks the unsubscribe link.
email.opened — Triggered when a prospect opens a campaign email (first open per campaign).
email.clicked — Triggered when a prospect clicks a tracked link (first click per link per day).
prospect.suppressed — Triggered when a prospect is added to the suppression list.
limit.hit — Triggered when a daily sending limit is reached (mailbox, domain, or plan).
Payload Format: Each webhook delivers a signed JSON payload via HTTP POST: { 'type': 'reply.received', 'data': { 'prospectId': '...', 'prospectEmail': '[email protected]', 'campaignId': '...', 'receivedAt': '2026-03-15T10:30:00Z' }, 'timestamp': '2026-03-15T10:30:00Z' }
Security Headers:
X-Warmy-Signature — HMAC-SHA256 signature for payload verification.
X-Warmy-Event-Type — The event type (e.g., reply.received).
X-Warmy-Event-Id — Unique event ID for deduplication.
Integration Examples:
CRM Sync (HubSpot, Salesforce, Pipedrive):
Subscribe to reply.received and email.bounced events.
On reply: create or update a CRM contact, log the interaction, create a task for follow-up.
On bounce: update contact status to invalid.
Slack/Teams Notifications:
Subscribe to reply.received.
Post to a sales channel when a prospect replies for real-time team awareness.
Zapier / Make / n8n:
Use these automation platforms as your webhook endpoint.
Create workflows that trigger actions in any of 5,000+ apps.
Example: Reply received → Create HubSpot deal → Notify Slack → Add to Google Sheet.
Retry Policy: Failed deliveries (non-200 responses) are retried up to 10 times with exponential backoff (1min, 5min, 15min, 1hr, 3hr, 6hr, 12hr, 24hr, 48hr, 72hr). Check delivery history in Settings > Webhooks.
Best Practice: Start with reply.received — it is the highest-value event for sales teams. Add more events as your integration matures.
Get started with the WarmySender REST API in 5 minutes.
Step 1: Create an API Key • Go to Settings > API Keys. • Click 'Create Key' and name it (e.g., 'My CRM Integration'). • Select scopes: choose read/write permissions for the resources you need. • Copy and save the full API key — it is shown only once.
Step 2: Make Your First Request All API requests use the base URL: https://warmysender.com/api/v1 Authenticate with the header: Authorization: Bearer YOUR_API_KEY
Example — List Your Prospects: GET /api/v1/prospects Returns a paginated list of prospects in your workspace.
Example — Add a Prospect: POST /api/v1/prospects Body: { 'email': '[email protected]', 'firstName': 'John', 'company': 'Acme' }
Example — List Campaigns: GET /api/v1/campaigns Returns all campaigns with status, stats, and configuration.
Step 3: Handle Responses • Success: 200 OK with JSON response body. • Created: 201 Created for POST requests. • Error: 400 (bad request), 401 (unauthorized), 403 (forbidden scope), 404 (not found), 429 (rate limited). • Rate limits: 60 requests per minute per API key.
Common Use Cases:
Create and manage campaigns programmatically.
Sync prospects from your CRM to WarmySender.
Pull campaign analytics into your dashboard.
Programmatically manage suppression lists.
Automate prospect enrollment into campaigns.
Start/pause campaigns based on external triggers.
Full API Reference: Visit warmysender.com/docs/integrations for complete endpoint documentation with request/response examples, error codes, and webhook setup.
Best Practices:
Use read-only scopes when you only need to pull data.
Store API keys securely — never commit them to code repositories.
Set expiration dates on keys used for temporary integrations.
Handle rate limit responses (429) with exponential backoff.
Use webhooks for real-time events instead of polling the API.
The WarmySender REST API lets you create prospects and enroll them into a campaign from your own systems (a CRM, a form, a workflow tool).
Two endpoints do the work:
Create a prospect — POST /api/v1/prospects (requires the prospects:write scope)
Enroll prospects into a campaign — POST /api/v1/campaigns/{campaignId}/enrollments (requires the enrollments:write scope)
Step 1 — Create an API key with the right permissions:
Go to Settings → API Keys and create a key.
Tick the scopes this integration needs: prospects:write (to create prospects) and enrollments:write (to enroll them).
The full key is shown once at creation — copy and store it securely. Keys start with ws_.
Send it on every request as a Bearer token: Authorization: Bearer ws_your_api_key_here
Paste the key EXACTLY — no leading/trailing spaces and no line breaks. A key copied with an extra space or newline is rejected and won't connect. In Settings → API Keys each key shows a 'last used' indicator; if your key still says 'Never used' after a request, it never reached us as that key (almost always a stray space/line break in the header).
Step 2 — Create a prospect (POST /api/v1/prospects): • Send at least an email. firstName, lastName, company, role, phone, linkedinUrl, and a customFields object are optional. linkedinUrl enables multichannel (email + LinkedIn) outreach. • Example: curl -X POST https://warmysender.com/api/v1/prospects -H "Authorization: Bearer ws_your_api_key_here" -H "Content-Type: application/json" -d '{"email":"[email protected]","firstName":"John","company":"Acme"}' • Returns 201 Created. If a prospect with that email already exists, the existing prospect is reused and returned (no duplicate). Keep the returned id if you'll enroll by ID.
Step 3 — Enroll prospects into a campaign (POST /api/v1/campaigns/{campaignId}/enrollments): • The body lets you choose who to enroll three ways — pass at least one, combine freely: - prospectIds: an array of prospect IDs. - emails: an array of email addresses (WarmySender finds the matching prospects for you). - listIds: an array of list IDs (enrolls everyone in those lists — simplest for a whole audience). • Example (by email): curl -X POST https://warmysender.com/api/v1/campaigns/cmp_123/enrollments -H "Authorization: Bearer ws_your_api_key_here" -H "Content-Type: application/json" -d '{"emails":["[email protected]","[email protected]"]}' • Already-enrolled prospects are skipped (counted as processed but not enrolled again), so re-running is safe. • Enrolling adds prospects to the campaign; it does not start a draft campaign by itself — see 'Managing Campaigns via API' for create/start/pause.
Machine-readable spec and full reference:
/api/v1/openapi.json — the OpenAPI specification; import it into Postman, Insomnia, or an SDK generator.
/docs/integrations — human-readable docs for every endpoint, authentication, idempotency, rate limits, error codes, and webhooks.
For a full walkthrough with curl examples, see /documentation/create-and-enroll-prospects-with-the-api. Related: 'API Quickstart Tutorial', 'Managing Campaigns via API'.
Complete reference for all webhook event types, payloads, and deduplication behavior.
8 Event Types Available:
1) reply.received Fires when a prospect replies to a campaign email (first reply only). Payload: prospectId, prospectEmail, campaignId, mailboxId, subject, messageId, receivedAt Dedup: One event per prospect per campaign (ever).
2) email.bounced Fires when an email hard-bounces (permanent delivery failure). Payload: prospectId, prospectEmail, campaignId, mailboxId, bounceType (hard/soft), bounceReason, bouncedAt Dedup: One event per prospect per campaign per day.
3) email.unsubscribed Fires when a prospect clicks the unsubscribe link. Payload: prospectId, prospectEmail, campaignId, unsubscribedAt Dedup: One event per prospect per campaign (ever).
4) email.opened Fires when a prospect opens a campaign email (tracked via invisible pixel). Payload: prospectId, prospectEmail, campaignId, mailboxId, stepIndex, openedAt Dedup: One event per prospect per campaign (first open only). Subsequent opens by the same prospect do not trigger additional events. Note: Some email clients (Apple Mail, Outlook) may auto-load images, causing false opens. Use clicks for more reliable engagement tracking.
5) email.clicked Fires when a prospect clicks a tracked link in a campaign email. Payload: prospectId, prospectEmail, campaignId, mailboxId, stepIndex, url, clickedAt Dedup: One event per unique URL per prospect per day. If a prospect clicks Link A and Link B, you receive two separate events. Clicking the same link twice on the same day fires only once.
6) prospect.suppressed Fires when a prospect is added to the suppression list (via unsubscribe, bounce, or manual suppression). Payload: prospectId (optional), email, reason, suppressedAt Dedup: One event per email per day.
7) limit.hit Fires when a daily sending limit is reached. Payload: limitType (daily_mailbox or daily_domain), mailboxId, campaignId, currentValue, limitValue, hitAt Dedup: One event per limit type per identifier per day.
8) webhook.test Fires when you send a test event via the API (POST /api/v1/webhooks/:id/test) or by clicking 'Test' in Settings > Webhooks. Payload: webhookId, timestamp, message Dedup: None — each test generates a unique event. Used to verify your endpoint is reachable and correctly processing events.
How to verify webhook signatures to ensure events are from WarmySender.
Why Verify Signatures? Without verification, anyone who discovers your endpoint URL could send fake events. Signature verification ensures only WarmySender can send valid events.
How It Works:
When you create a webhook, you receive a secret (format: whsec_xxxx). Save it securely.
Every webhook delivery includes an X-Warmy-Signature header.
The header format is: t=<timestamp>,v1=<hex_signature>
To verify, reconstruct the signature using your secret and compare.
Verification Steps:
Step 1: Extract timestamp and signature from X-Warmy-Signature header:
Understanding and monitoring your domain's sender reputation.
What Is Domain Reputation? Email providers (Gmail, Outlook, Yahoo) assign a reputation score to every sending domain based on engagement, complaints, and bounces. High reputation = inbox placement. Low reputation = spam folder.
Monitoring in WarmySender:
Analytics > Mailboxes — SPF, DKIM, DMARC check status per domain.
Analytics > Deliverability — Inbox rate trends, domain health matrix.
Warmup > Per-mailbox health scores — Real-time sender reputation per mailbox.
External Monitoring Tools (Recommended):
Google Postmaster Tools — Free. Shows your domain reputation as seen by Gmail (High, Medium, Low, Bad). Set up at postmaster.google.com.
Microsoft SNDS — Shows your IP reputation with Outlook/Hotmail.
MXToolbox — Check if your domain is on any email blocklists.
Mail-tester.com — Send a test email and get a spam score.
Reputation Factors:
Bounce rate — High bounces signal bad list quality. Keep below 3%.
Spam complaints — Recipient-reported spam is the strongest negative signal.
Engagement — Opens and replies boost reputation. Ignored emails lower it.
Volume consistency — Sudden spikes in volume look suspicious.
Authentication — SPF, DKIM, DMARC all properly configured.
Content quality — Spam trigger words, excessive links, or HTML reduce trust.
Improving Reputation:
Verify email lists before sending (use Email Verifier).
Warm up properly — do not skip the 2-3 week warmup period.
Start campaigns with low volume (20-30/day) and increase gradually.
Monitor bounce rates and stop campaigns immediately if above 5%.
Keep warmup running in Maintenance mode alongside campaigns.
Remove non-engaging prospects after 3-4 touchpoints.
Ensure DNS records are complete and valid.
Recovery from Bad Reputation: • If your domain reputation drops to Low or Bad: 1) Pause all campaigns immediately. 2) Run warmup only in Recovery mode for 2-4 weeks. 3) Verify and clean all prospect lists. 4) Review email content for spam triggers. 5) Resume campaigns at very low volume once health recovers above 70. • Severe damage may take 4-8 weeks to recover from. • If a domain is permanently flagged, consider retiring it and warming up a new secondary domain.
If you've connected many mailboxes that all live on the same email hosting account, the host may briefly limit how many connections it accepts at once — so a few mailboxes can momentarily show 'Reconnecting…' or even 'Auth Error' even though your password is correct and your other mailboxes on the same account work fine. It's a temporary host-side limit, not a wrong password. WarmySender now paces its connections, tells a busy-host hiccup apart from a real password problem, and recovers on its own. In almost every case there's nothing you need to do.
Full explainer: /documentation/many-mailboxes-on-one-hosting-account-show-reconnect
Why one or several of your mailboxes can suddenly show a connection problem or a 'Reconnecting…' status — even ones that have been warming healthily for weeks — and why you almost certainly don't need to do anything. It's usually a brief, temporary hiccup on your provider's side, not your password or settings. WarmySender keeps retrying automatically and resumes warmup on its own, usually within a day or so. An optional one-click 'Reconnect all' can nudge it.
Full explainer: /documentation/why-are-my-mailboxes-reconnecting
The full methodology behind our email warmup tools comparison page: how vendors are selected, why we distinguish peer-to-peer networks from curated networks, how the feature matrix is verified, the 120-day refresh cadence, and how to submit a correction. Written for B2B founders evaluating which warmup tool to trust.
Full explainer: /documentation/email-warmup-benchmark-methodology
The full methodology behind our neutral email deliverability benchmarks page: source-quality tiers (Tier A primary studies, Tier B aggregators), the citation-index format, why some cells read 'No public benchmark available', the 180-day refresh cadence, and how to suggest a source. Written for journalists, researchers, and operators who want to cite the numbers.
Full explainer: /documentation/deliverability-benchmark-methodology
If WarmySender shows your mailbox as 'Provider Blocked' or 'Domain Blacklisted', it means your email provider (Outlook, Gmail, Yahoo, etc.) has restricted sending on the account. This guide explains the four common causes, how to verify which one applies, and how to recover safely without making things worse.
WarmySender sends real-time webhook notifications for key events: email replies, LinkedIn replies (with the reply body), LinkedIn invite acceptances, bounces, unsubscribes, opens, clicks, and sending-limit alerts. This guide is the canonical reference — specific integrations (Slack, n8n, HubSpot, etc.) link back here.
Event Catalog:
reply.received — Prospect replied to a campaign email. Payload: prospectId, prospectEmail, campaignId, sequenceId, mailboxId, subject, messageId, receivedAt, channel.
linkedin.reply_received — Prospect replied to a LinkedIn message or InMail. Payload: prospectId, prospectName, prospectLinkedinUrl, campaignId, enrollmentId, linkedinAccountId, messageText (the reply body, up to ~400 chars for Slack / full length in JSON), threadId, receivedAt.
webhook.test — Fired by the test button in Settings for endpoint verification.
All events use the same envelope: { type, data, timestamp }.
Creating a Webhook:
Settings → Webhooks → New webhook.
Paste your endpoint URL. Slack Incoming Webhook URLs (https://hooks.slack.com/…) are auto-formatted as Block Kit messages — see the 'Slack Notifications' guide. Everything else receives the signed JSON payload.
Pick events. Start with reply.received + linkedin.reply_received + linkedin.invite_accepted for sales teams; add email.bounced + limit.hit for ops.
Save. WarmySender returns a webhook secret — save it somewhere secure, you'll need it to verify signatures. The secret is shown once.
Click the test button on the webhook row to send a webhook.test event end-to-end. You should receive a POST within ~10 seconds.
Signature Verification (HMAC-SHA256): Every delivery includes these headers: • X-Warmy-Event-Id — unique event UUID (use for idempotency on your side) • X-Warmy-Event-Type — e.g., linkedin.reply_received • X-Warmy-Signature — combined Stripe-style format: t=<unix_ms>,v1=<hmac_hex>. The canonical timestamp lives inside this header — parse v1= out before comparing, and use the parsed t= for the HMAC input. (X-Warmy-Timestamp is also sent as a separate header for convenience/logging but the canonical copy is inside X-Warmy-Signature.) • Content-Type: application/json
The HMAC input is the string `${t}.${rawBody}` signed with your webhook secret using SHA-256.
Verify in Node.js (Express). Two common pitfalls: (1) reading X-Warmy-Signature as raw hex — it isn't, parse v1= first. (2) comparing against re-serialized JSON — key order, whitespace, and unicode escaping won't byte-match what we signed. Always capture the RAW request body before json parsing.
const crypto = require('crypto'); // Capture raw body BEFORE express.json(): // app.use(express.json({ verify: (req, _r, buf) => { req.rawBody = buf.toString('utf8'); } })); app.post('/webhook', (req, res) => { const sigHeader = req.headers['x-warmy-signature'] || ''; const parts = Object.fromEntries(sigHeader.split(',').map(p => p.split('='))); const ts = parts.t; const sig = parts.v1; if (!ts || !sig) return res.sendStatus(400); if (Math.abs(Date.now() - parseInt(ts, 10)) > 5 * 60 * 1000) return res.sendStatus(401); // 5-min replay guard const expected = crypto.createHmac('sha256', WEBHOOK_SECRET).update(ts + '.' + req.rawBody).digest('hex'); const a = Buffer.from(sig, 'hex'); const b = Buffer.from(expected, 'hex'); if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) return res.sendStatus(401); // signature valid — process the event res.sendStatus(200); });
Skipping verification is acceptable on a private network (self-hosted n8n on a VPN). Always verify when the endpoint is publicly reachable.
Idempotency & Deduplication: Delivery is at-least-once — the same event may be delivered more than once due to retries or network races. Use the X-Warmy-Event-Id header as your dedupe key (store it in a database or cache for ~24 h).
For LinkedIn events, we dedupe at the source (per-enrollment for replies, per-acceptance for invites) so our LinkedIn provider webhook retries don't cause duplicate emissions. Your endpoint still needs its own dedupe as defense in depth.
First-Reply Semantics (linkedin.reply_received): This event fires once per enrollment when the prospect first responds. Subsequent messages in the same thread do NOT re-fire (same semantics as campaigns auto-pausing on first reply). If you need every inbound message on a thread (not just the first reply), the webhook event catalog above isn't sufficient — please contact support to discuss options; this isn't currently exposed as a standalone event.
Retry Schedule: On any non-2xx response or 5-second timeout, we retry up to 10 times with exponential backoff: 1 min → 5 min → 15 min → 1 h → 3 h → 6 h → 12 h → 24 h → 48 h → 72 h. Honor Retry-After on HTTP 429 — we parse both seconds and HTTP-date formats, capped at our max backoff. After 10 failed attempts, the delivery is marked failed and the webhook's failure count is incremented.
Account Safety (LinkedIn Events): WarmySender's webhook delivery does not make any LinkedIn API calls on your behalf — events are emitted from our own recorded state only, and each reply or acceptance is recorded exactly once, so a repeated upstream signal never produces a duplicate event or extra work. Toggling webhooks on or off doesn't change how often we poll LinkedIn via our LinkedIn provider; your LinkedIn account's daily action limits are driven by campaign sends / invites / profile views, not by webhook activity.
Testing:
Use the test button in Settings → Webhooks for an end-to-end sanity check (fires webhook.test via the real delivery path).
For ad-hoc testing of a specific event, use tools like RequestBin or webhook.site to inspect the payload shape before wiring to your production endpoint.
LinkedIn event testing: reply to yourself from a test LinkedIn account (or have a teammate reply) and watch Settings → Webhooks → Recent Deliveries.
Troubleshooting:
Signature mismatch → check you're hashing the raw body, not the parsed-then-reserialized JSON; check you're using the webhook secret, not the API key.
No delivery when expected → confirm you're subscribed to the right event type; check Recent Deliveries in Settings for 4xx/5xx responses.
Test button returns 200 but nothing arrives → your endpoint is returning 200 without actually doing anything, or the event got filtered; check Recent Deliveries for the test event.
LinkedIn reply event not firing → only the FIRST reply per enrollment emits; subsequent messages in the same thread don't re-fire by design.
Related Guides: 'Slack Notifications' (native, no middleware), 'n8n Integration', 'Zapier Integration', 'Make Integration', 'HubSpot CRM Integration'.
Connect WarmySender to HubSpot CRM to automatically sync prospect activity and campaign data.
What This Integration Does:
Automatically create or update HubSpot contacts when prospects reply, open, or click.
Log campaign activity (emails sent, opens, clicks, replies) as timeline events on HubSpot contact records.
Create deals or tasks in HubSpot when a prospect replies to your campaign.
Keep your suppression list in sync — bounced or unsubscribed contacts are flagged in HubSpot.
Setup Option 1: Direct Webhook (Recommended)
Step 1: Create a webhook handler Build a simple endpoint on your server (or use a serverless function like AWS Lambda, Vercel, or Cloudflare Workers) that receives WarmySender webhook events and calls the HubSpot API.
Step 2: Configure the webhook in WarmySender • Go to Settings > Webhooks > Create Webhook. • Enter your handler endpoint URL. • Subscribe to events: reply.received, email.opened, email.clicked, email.bounced, email.unsubscribed. • Save and copy the webhook secret for signature verification.
Step 3: Map events to HubSpot actions In your webhook handler, call the HubSpot API based on the event type: • reply.received → Create/update contact, create a deal, log a note: POST /crm/v3/objects/contacts (HubSpot API) • email.opened → Update contact property 'last_engagement_date', log timeline event • email.clicked → Update contact property, log the clicked URL as a note • email.bounced → Set contact property 'email_status' to 'invalid' • email.unsubscribed → Set contact property 'hs_email_optout' to true
Step 4: Test Click 'Test' in WarmySender webhook settings. Verify the test event reaches your handler and creates a record in HubSpot.
Setup Option 2: Via Zapier (No Code) See the 'Zapier Integration' guide below for a no-code approach using Zapier as the middleware between WarmySender webhooks and HubSpot.
HubSpot API Reference:
Contacts API: POST /crm/v3/objects/contacts
Deals API: POST /crm/v3/objects/deals
Notes API: POST /crm/v3/objects/notes
Authentication: Use a HubSpot Private App token (Bearer auth).
Best Practices:
Use HubSpot's 'upsert' (createOrUpdate) to avoid duplicate contacts — match by email.
Map WarmySender prospectId to a custom HubSpot property for traceability.
Log the campaign name and step index in HubSpot notes for context.
Set up HubSpot workflows to auto-assign deals to sales reps when a reply is received.
Connect WarmySender to Salesforce to sync campaign activity and create leads automatically.
What This Integration Does:
Create Salesforce Leads or Contacts when prospects reply to your campaigns.
Log email opens, clicks, and replies as Activities on the Lead/Contact record.
Update Lead Status when emails bounce or prospects unsubscribe.
Create Opportunities when high-intent actions are detected (e.g., link clicks, replies).
Setup Option 1: Direct Webhook
Step 1: Create a middleware endpoint Build a handler (AWS Lambda, Heroku, etc.) that translates WarmySender webhook events into Salesforce API calls.
Step 2: Configure the webhook • Go to Settings > Webhooks > Create Webhook. • Enter your middleware endpoint URL. • Subscribe to: reply.received, email.opened, email.clicked, email.bounced, email.unsubscribed.
Step 3: Map events to Salesforce objects • reply.received → Upsert Lead (match by email), create Task ('Follow up — prospect replied'), update Lead Status to 'Contacted' • email.opened → Create Activity (Subject: 'Email Opened — [Campaign Name]') • email.clicked → Create Activity with the clicked URL, update Lead Score • email.bounced → Update Lead Status to 'Bad Email' • email.unsubscribed → Update Lead Status to 'Unsubscribed', set Email Opt Out = true
Step 4: Salesforce authentication Use Salesforce Connected App with OAuth 2.0 (JWT Bearer flow for server-to-server). Store your Salesforce access token securely.
Setup Option 2: Via Zapier or Make See the Zapier or Make integration guides for a no-code approach.
Salesforce API Endpoints:
Create Lead: POST /services/data/v59.0/sobjects/Lead
Create Task: POST /services/data/v59.0/sobjects/Task
Upsert by external ID: PATCH /services/data/v59.0/sobjects/Lead/Email__c/{email}
Best Practices:
Use External ID fields (email) for upsert to avoid duplicate records.
Create a custom Salesforce field 'WarmySender_Campaign_ID' for attribution.
Use Salesforce Process Builder or Flow to auto-assign leads to the right rep based on territory.
Log all WarmySender events as Activities for a complete timeline view.
Connect WarmySender to 7,000+ apps using Zapier — no code required.
How It Works: Zapier acts as a bridge between WarmySender webhooks and any app Zapier supports (HubSpot, Salesforce, Slack, Google Sheets, Airtable, Gmail, Notion, and thousands more).
Step-by-Step Setup:
Step 1: Create a Zap in Zapier • Log in to zapier.com and click 'Create Zap'. • For the trigger, choose 'Webhooks by Zapier'. • Select trigger event: 'Catch Hook'. • Zapier generates a unique webhook URL — copy it.
Step 2: Register the webhook in WarmySender • Go to Settings > Webhooks > Create Webhook. • Paste the Zapier webhook URL. • Select which events to subscribe to (e.g., reply.received, email.clicked). • Save the webhook.
Step 3: Send a test event • Click 'Test' in WarmySender webhook settings. • Go back to Zapier and click 'Test Trigger' — it should find the test event. • Zapier will show you the payload structure.
Step 4: Add an action Choose what happens when the event fires. Popular actions: • HubSpot: Create/Update Contact • Salesforce: Create Lead • Google Sheets: Create Spreadsheet Row • Slack: Send Channel Message • Pipedrive: Create Person/Deal • Gmail: Send Email (internal notification) • Airtable: Create Record • Notion: Create Database Item
Step 5: Map fields Map WarmySender webhook fields to your action app: • data.prospectEmail → Contact Email • data.prospectId → External ID • data.campaignId → Source Campaign • type → Event Type
Step 6: Test and enable Test the full Zap, then turn it on. Events from WarmySender will automatically trigger your action.
Popular Zap Recipes:
Reply received → Create HubSpot deal + Notify Slack channel
Email bounced → Update Google Sheet row + Remove from Mailchimp list
Link clicked → Create Pipedrive activity + Send Slack DM to sales rep
Prospect suppressed → Update Airtable record
Tips:
Use Zapier's 'Filter' step to only trigger actions for specific campaign IDs or event types.
Use 'Formatter' to transform data (dates, text) before sending to the destination app.
Enable 'Autoreplay' so failed Zaps are automatically retried.
Use multi-step Zaps to chain actions (e.g., create contact → create deal → send notification).
Connect WarmySender to 1,500+ apps using Make (formerly Integromat) for advanced automation workflows.
Why Make: Make offers more complex branching, filtering, and data transformation than Zapier — ideal for multi-step automation with conditional logic.
Step-by-Step Setup:
Step 1: Create a new Scenario in Make • Log in to make.com and click 'Create a new Scenario'. • Add a trigger module: search for 'Webhooks' and select 'Custom webhook'. • Click 'Add' to create a new webhook — Make generates a unique URL. Copy it.
Step 2: Register in WarmySender • Go to Settings > Webhooks > Create Webhook. • Paste the Make webhook URL. • Subscribe to your desired events. • Click 'Test' to send a sample event.
Step 3: Determine data structure • Go back to Make and click 'Redetermine data structure' on the webhook module. • It will detect the WarmySender payload fields automatically.
Step 4: Add action modules Connect modules for your destination app: • Router module — Branch based on event type (reply.received → one path, email.bounced → another). • HubSpot module — Create/Update Contact, Create Deal. • Google Sheets module — Add Row. • Slack module — Send Message. • HTTP module — Call any API.
Step 5: Add filters and routing Make excels at conditional routing: • Route 1: If type = 'reply.received' → Create CRM deal + Notify Slack • Route 2: If type = 'email.bounced' → Update CRM status + Log to sheet • Route 3: If type = 'email.clicked' → Score lead + Create task
Step 6: Enable the scenario Set the scheduling to 'Immediately' (webhook-triggered). Toggle the scenario on.
Advanced Features:
Data stores — Keep a local database in Make for deduplication and lookups.
Iterators — Process multiple items from a single webhook (e.g., batch events).
Error handlers — Add fallback routes for failed operations.
Aggregators — Collect multiple events and send a daily summary.
Best Practices:
Use Make's built-in 'JSON' module to parse the webhook payload if auto-detection fails.
Add error handlers to every critical module to prevent scenario failures.
Use data stores to track which prospects have already been synced to avoid duplicates.
Set up email notifications for scenario errors in Make's settings.
Connect WarmySender to n8n, the open-source workflow automation tool, to fan out events (email replies, LinkedIn replies, invite acceptances, bounces) into any downstream system — CRM, databases, Slack, Teams, Discord, Sheets, custom APIs.
Why n8n:
Self-hosted — your data stays on your infrastructure.
No per-task pricing — unlimited executions.
400+ integrations with a visual workflow builder.
Ideal for teams with privacy requirements or high automation volume.
Setup:
Step 1: Create a Webhook trigger in n8n • Open your n8n instance and create a new workflow. • Add a 'Webhook' node as the trigger (under Core Nodes). • Set HTTP Method to POST. • Set Response Mode to 'Immediately' (we need a 200 within 5 seconds — our timeout). • Activate the workflow and copy the Production URL (NOT the Test URL — test URLs expire).
Step 2: Register in WarmySender • Settings → Webhooks → New webhook. • Paste the n8n Production URL. • Subscribe to desired events (see list below). • Save and click the test button to confirm delivery.
Step 3: Route by event type Add a Switch node after the Webhook trigger, routing on {{ $json.type }}: • reply.received — Email campaign reply • linkedin.reply_received — LinkedIn message / InMail reply (includes reply body in messageText) • linkedin.invite_accepted — LinkedIn connection request accepted • email.bounced — Hard bounce • email.unsubscribed — Unsubscribe link clicked • email.opened / email.clicked — Open / link click (high volume) • prospect.suppressed — Prospect added to suppression list • limit.hit — Daily sending limit reached • webhook.test — Test event fired from Settings
Step 4: Add downstream actions Example chains (from real customer setups):
1) LinkedIn reply → Slack + HubSpot task: Webhook → IF (type = linkedin.reply_received) → Slack node (post to #sales-replies with {{ $json.data.messageText }}) → HubSpot node (Create Task: 'Follow up on LinkedIn reply').
2) Every reply → Google Sheets log: Webhook → IF (type contains 'reply') → Google Sheets 'Append Row' (Timestamp, Channel, Prospect, Campaign, Body).
3) Invite accepted → Pipedrive deal: Webhook → IF (type = linkedin.invite_accepted) → Pipedrive node (Create Deal in 'Connected' stage, mapped from {{ $json.data.prospectLinkedinUrl }}).
4) Per-campaign routing to different Slack channels: Webhook → Switch (by {{ $json.data.campaignId }}) → multiple Slack outputs, one per channel.
5) Bounce log + ops alert: Webhook → IF (type = email.bounced) → your database insert node → Microsoft Teams node.
Signature Verification in n8n (publicly-reachable endpoints): Every payload is signed with HMAC-SHA256. The X-Warmy-Signature header is Stripe-style `t=<unix_ms>,v1=<hmac_hex>` — you must parse it and verify against the RAW request body (not the parsed JSON).
Two setup steps:
On the Webhook trigger node, under 'Options', enable 'Raw Body' so the raw bytes are preserved on `$binary.data`.
Add a Function node before the Switch with this code:
const crypto = require('crypto'); const secret = $env.WARMY_WEBHOOK_SECRET; // set in n8n credentials/env — never hardcode const headers = $input.first().headers; const sigHeader = headers['x-warmy-signature'] || ''; const parts = Object.fromEntries(sigHeader.split(',').map(p => p.split('='))); const ts = parts.t; const sig = parts.v1; if (!ts || !sig) throw new Error('Missing signature'); if (Math.abs(Date.now() - parseInt(ts, 10)) > 5 * 60 * 1000) throw new Error('Stale timestamp'); const rawBody = Buffer.from($input.first().binary.data.data, 'base64').toString('utf8'); const expected = crypto.createHmac('sha256', secret).update(ts + '.' + rawBody).digest('hex'); const a = Buffer.from(sig, 'hex'); const b = Buffer.from(expected, 'hex'); if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) throw new Error('Bad signature'); // re-parse body for downstream nodes $input.first().json = JSON.parse(rawBody); return $input.all();
If Raw Body isn't enabled, re-serializing $json will NOT byte-match what we signed (key order / whitespace / unicode escaping all differ) and verification will fail 100% of the time.
Note: linkedin.reply_received fires once per enrollment on the FIRST reply. Subsequent messages in the same thread don't re-fire. If you need every inbound message, contact support — this isn't currently exposed as a standalone event.
Advanced: WarmySender API from n8n: Beyond webhook consumption, use n8n HTTP Request nodes to call the WarmySender REST API: • Create prospects: POST /api/v1/prospects (email, firstName, lastName, company, linkedinUrl, custom fields). • Enroll in campaign: POST /api/v1/campaigns/:id/enrollments with prospectIds. • Unenroll: DELETE /api/v1/campaigns/:id/enrollments with emails or prospectIds. • Example: lead replies on WhatsApp via Interakt → n8n workflow unenrolls from WarmySender email campaign to prevent duplicate outreach.
Account Safety (LinkedIn Events): WarmySender's webhook delivery does not make any LinkedIn API calls on your behalf — payloads come from our database state only. Toggling webhooks on or off doesn't change how often we poll LinkedIn via our LinkedIn provider; your LinkedIn account's daily action limits are driven by campaign sends / invites / profile views, not by webhook activity. Enable as many webhooks as you need.
Reliability:
At-least-once delivery — dedupe on the X-Warmy-Event-Id header on your end.
10 retry attempts with exponential backoff (1 min → 72 h) on non-2xx responses.
5-second timeout per request — set n8n Response Mode to 'Immediately' and process async after.
Best Practices:
Add error-handling nodes (Error Trigger workflow) for CRM API failures.
Store API keys in n8n credentials manager — never hardcode.
Use Idempotency-Key headers on WarmySender create/enroll calls.
For publicly-reachable n8n, always verify X-Warmy-Signature.
Zapier / Make: Same pattern — 'Webhooks by Zapier' (Catch Hook) or Make's Webhook trigger. Copy the URL, paste into WarmySender Settings → Webhooks, chain downstream modules. Zapier/Make handle format translation between our JSON and Slack/HubSpot/etc., but for native Slack, see the 'Slack Notifications' guide — our direct Slack auto-format is simpler than going through Zapier.
Get real-time notifications in Slack when prospects engage with your campaigns — including LinkedIn replies with the message body, email replies, bounces, unsubscribes, and sending-limit alerts. No Zapier, Make, or n8n in the middle: WarmySender auto-detects Slack Incoming Webhook URLs and formats each event as a readable Slack Block Kit card.
What Arrives in Slack:
LinkedIn reply — prospect name, LinkedIn profile URL, full reply body (truncated to ~400 chars), campaign, timestamp
Step 1: Create a Slack Incoming Webhook • Go to api.slack.com/apps → 'Create New App' → 'From scratch'. • Name it 'WarmySender' and pick the workspace where you want alerts. • In the left sidebar under 'Features', open 'Incoming Webhooks' and toggle it On. • Click 'Add New Webhook to Workspace', pick the channel where alerts should land (e.g., #sales-replies), and authorize. • Copy the webhook URL — it looks like https://hooks.slack.com/services/T0.../B0.../xxxx
Step 2: Add the webhook in WarmySender • Settings → Webhooks → New webhook. • Paste the Slack URL. • Select the events you want. Recommended: reply.received, linkedin.reply_received, linkedin.invite_accepted, email.bounced. • Save.
Step 3: Verify • In the webhook row, click the refresh/test button. A test message should appear in your Slack channel within ~10 seconds. • If nothing arrives, check the Slack app's webhook URL is correct and the target channel still exists.
That's it — no middleware, no code, no third-party automation tool.
How It Works: When the webhook URL matches https://hooks.slack.com/…, we transform the JSON payload into Slack Block Kit shape before sending. Other URLs receive the raw signed JSON payload as usual. This means one event can fan out to a Slack channel AND your CRM webhook endpoint simultaneously with zero extra work.
LinkedIn-Specific Events:
linkedin.reply_received — Fires the first time a prospect replies to a LinkedIn message or InMail inside a campaign enrollment. Payload includes the reply body. Follow-up messages in the same thread don't re-fire (matches how campaigns auto-pause on first reply).
linkedin.invite_accepted — Fires once per prospect when they accept your LinkedIn connection request. Detected via our LinkedIn provider real-time webhooks (message-matched) with polling fallback for accepts without a message — expect up to ~8h detection latency on no-message accepts (our LinkedIn provider's documented behavior).
Multi-Channel Routing (one event → different channels): Create multiple Slack Incoming Webhooks (one per channel — #sales-replies, #ops-bounces, #linkedin-connected). Add each as a separate webhook in WarmySender with a different event selection. Events fan out in parallel.
Recommended Events Per Channel:
#sales-replies — reply.received, linkedin.reply_received (highest priority; prospect is engaged NOW)
AVOID: email.opened / email.clicked (high volume; floods the channel — use n8n/Zapier with per-campaign filters instead)
Microsoft Teams: Teams uses a different payload format (Adaptive Cards) than Slack. Our native auto-format targets Slack only. For Teams: use the 'n8n Integration' or 'Zapier Integration' guide to translate our JSON to Teams Adaptive Card format in the middle.
Account Safety (LinkedIn Events): Enabling these webhooks does NOT call the LinkedIn API — we emit from database state only, read once on reply detection. Your LinkedIn daily action limits are unaffected.
10 retry attempts with exponential backoff (1 min → 72 h) if Slack is temporarily unreachable.
On Slack 429 Too Many Requests, we honor the Retry-After header automatically.
Privacy Note: Slack messages include prospect email / LinkedIn profile URL / reply body in plain text. Slack retains message history per your workspace's retention policy — choose the destination channel accordingly (private channel for sensitive conversations).
See also: 'Webhooks Getting Started' guide for signing verification, full event catalog, and retry behavior.
Automatically log WarmySender campaign events to Google Sheets for reporting and analysis.
What This Integration Does:
Append a new row to a Google Sheet every time a prospect replies, opens, clicks, bounces, or unsubscribes.
Build custom dashboards and reports from live campaign data.
Share campaign performance with team members who don't have WarmySender access.
Setup via Zapier (Recommended — No Code):
Step 1: Create your Google Sheet • Create a new Google Sheet with column headers: Timestamp | Event Type | Prospect Email | Campaign ID | Step Index | URL Clicked | Details
Step 2: Create a Zap • Trigger: Webhooks by Zapier > Catch Hook. • Copy the Zapier webhook URL.
Step 3: Register in WarmySender • Settings > Webhooks > Create Webhook. • Paste Zapier URL, subscribe to all events you want to log. • Send a test event.
Step 4: Configure the Google Sheets action • Action: Google Sheets > Create Spreadsheet Row. • Select your spreadsheet and worksheet. • Map fields: - Timestamp → data.openedAt / data.clickedAt / data.receivedAt (use Zapier formatter for consistent dates) - Event Type → type - Prospect Email → data.prospectEmail - Campaign ID → data.campaignId - Step Index → data.stepIndex (for opens/clicks) - URL Clicked → data.url (for email.clicked events) - Details → Full JSON payload (optional)
Setup via Make:
Webhook module → Google Sheets 'Add a Row' module.
Use Make's router to format different event types into consistent columns.
Setup via Apps Script (Advanced): Deploy a Google Apps Script web app as your webhook endpoint: 1) Open your Sheet > Extensions > Apps Script. 2) Write a doPost(e) function that parses the webhook JSON and appends a row. 3) Deploy as web app (accessible to 'Anyone'). 4) Use the deployment URL as your WarmySender webhook endpoint.
Reporting Ideas:
Pivot table by campaign to compare reply rates.
Chart daily opens/clicks over time.
Filter by prospect email to see full engagement history.
Use COUNTIF formulas to calculate per-campaign metrics.
Best Practices:
Create separate sheets (tabs) for different event types if volume is high.
Add data validation to prevent sheet corruption.
Set up automatic archiving — move rows older than 30 days to an archive sheet.
Use Google Sheets API quotas wisely — batch operations if volume exceeds 60 events/minute.
Connect WarmySender to GoHighLevel (GHL) for agency CRM sync and lead management.
What This Integration Does:
Create GHL contacts when prospects reply to WarmySender campaigns.
Trigger GHL workflows based on prospect engagement (opens, clicks, replies).
Sync suppression lists between WarmySender and GHL.
Log campaign activity on GHL contact timelines.
Setup via Webhook + GHL API:
Step 1: Get your GHL API credentials • In GHL, go to Settings > Business Profile > API (or use the Agency API for sub-accounts). • Generate an API key or use OAuth for sub-account access.
Step 2: Create a middleware Build a handler that translates WarmySender events to GHL API calls:
reply.received → POST /contacts/upsert (GHL API) with email, name, and source tag. Then POST /contacts/{id}/notes to log the reply.
email.bounced → POST /contacts/upsert, add tag 'bounced', update DND (Do Not Disturb) settings.
email.clicked → POST /contacts/{id}/notes with the clicked URL.
Step 3: Register in WarmySender • Settings > Webhooks > Create Webhook. • Enter your middleware endpoint URL. • Subscribe to: reply.received, email.bounced, email.clicked, email.unsubscribed.
Setup via Zapier (No Code):
Trigger: Webhooks by Zapier (Catch Hook) with WarmySender events.
Zapier has a native GHL integration — no middleware needed.
GHL Workflow Triggers: Once contacts are created in GHL, you can trigger GHL internal workflows: • Contact Created → Assign to pipeline stage. • Tag Added ('replied') → Notify agent, move to appointment booking. • Tag Added ('bounced') → Remove from GHL sequences.
Agency Setup (Multi Sub-Account):
Use GHL Agency API to route contacts to the correct sub-account.
Map WarmySender workspace → GHL sub-account by ID.
Each sub-account can have its own WarmySender webhook endpoint.
Best Practices:
Use GHL's upsert endpoint to avoid duplicate contacts.
Tag contacts with 'warmysender' source for attribution.
Set DND email = true for unsubscribed contacts to prevent GHL from re-emailing them.
Use GHL's custom fields to store WarmySender campaign ID and prospect ID.
Connect WarmySender to Airtable to build a custom engagement tracking database.
What This Integration Does:
Create Airtable records for every campaign event (opens, clicks, replies, bounces).
Build custom views and reports using Airtable's powerful filtering and grouping.
Share live campaign data with team members using Airtable's collaboration features.
Trigger Airtable Automations based on WarmySender events.
Setup via Zapier (Recommended):
Step 1: Prepare your Airtable base • Create a table called 'Campaign Events' with these fields: - Event Type (Single Select: reply.received, email.opened, email.clicked, email.bounced, email.unsubscribed) - Prospect Email (Email) - Campaign ID (Single Line Text) - Step Index (Number) - URL Clicked (URL) - Timestamp (Date) - Raw Payload (Long Text)
Step 2: Create a Zap • Trigger: Webhooks by Zapier > Catch Hook. • Action: Airtable > Create Record. • Map WarmySender event fields to Airtable columns.
Step 3: Register in WarmySender • Settings > Webhooks > paste Zapier URL, subscribe to events.
Setup via Make:
Webhook module → Airtable 'Create a Record' module.
Use Make's router to handle different event types.
Setup via Airtable Automations (Advanced): Airtable has built-in automations with a 'When webhook received' trigger: 1) In your Airtable base, go to Automations > Create Automation. 2) Trigger: 'When webhook received' — Airtable provides a URL. 3) Use that URL as your WarmySender webhook endpoint. 4) Action: 'Create record' in your events table. 5) Map the incoming JSON fields to your table columns.
Useful Airtable Views:
Grid View — Filter by event type or campaign for quick scanning.
Kanban View — Group by event type to see pipeline stages.
Calendar View — See events on a timeline.
Gallery View — Card-style view of prospect activity.
Pivot Table extension — Cross-tab campaign vs. event type.
Best Practices:
Create a linked 'Prospects' table and use Airtable's record linking to connect events to prospect records.
Use Airtable's formula fields to calculate metrics (e.g., reply rate = COUNTIF reply / total events).
Set up Airtable automations to send email or Slack alerts when high-value events occur.
Archive old records monthly to keep your base fast (Airtable slows above 50,000 records).
Connect Claude Desktop, Claude Code, Cursor, Windsurf, Zed, and other MCP-compatible AI clients to your WarmySender workspace using the Model Context Protocol (MCP). Once connected, your AI assistant can list campaigns, enroll prospects, check mailbox health, pause LinkedIn campaigns, update warmup settings, and more — all in natural language, with your account's safety limits enforced by our scheduler.
What Is MCP? MCP (Model Context Protocol) is an open standard from Anthropic that lets AI assistants talk to external tools and data. Instead of copy-pasting information between tabs, you ask your AI — "list my active campaigns," "enroll these 20 prospects in campaign X," "pause the SDR LinkedIn campaign" — and it calls the right WarmySender action on your behalf.
What You Can Do:
List email + LinkedIn campaigns with live counters (sent, opened, replied, bounced)
Enroll / unenroll prospects in bulk (up to 500 per call)
Create, update, and bulk-import prospects (up to 500 per request)
Check mailbox health, warmup stats, and per-mailbox deliverability
List LinkedIn accounts + health + current weekly invite/message usage
Create, start, pause, resume LinkedIn campaigns (never direct send — scheduler enforces all account safety)
Enroll prospects in LinkedIn campaigns (queued, scheduler-paced within daily caps)
Publish and manage LinkedIn posts, and post, publish, or close recruiter jobs (and read applicants)
Run Instagram DM campaigns — create, launch, enroll an audience, and check health + results
Add, verify, list, and remove your own branded open/click tracking domains
Search 11M+ B2B leads, then save them to a list or export with full contact details
Verify a single email or submit a whole list, then read the results
Update warmup settings per mailbox or in bulk
Add emails or domains to the suppression list
Poll async job status (bulk updates, connection tests)
What You Cannot Do (by design):
No direct LinkedIn sends from MCP — all LinkedIn actions route through the same scheduler the UI uses, which enforces the 4-week ramp, daily/weekly caps, and per-account safety limits. A banned account is unrecoverable, so this is non-negotiable.
No account connect/disconnect — adding or removing a LinkedIn or email account stays in the web UI (prevents a compromised AI from draining your LinkedIn seats).
No delete operations — soft-cancel via pause / archive only; permanent deletes happen in the UI after explicit confirmation.
No modification of warmup subject-line ref tags (protects your inbox filtering).
Supported AI Clients:
Claude Desktop (Mac / Windows)
Claude Code (CLI)
Cursor
Windsurf (Codeium)
Zed
Any client that speaks MCP over Streamable HTTP (the 2025-11 spec)
Authentication: MCP uses your existing WarmySender API key (ws_ prefix). Create one in Settings > API Keys with the scopes you want to expose (e.g., campaigns:read, campaigns:write, prospects:write, linkedin:read, warmup:write). The same key works for both REST API and MCP — no separate credentials.
Scope Mapping (your key needs these for each tool):
create/start/pause/resume_linkedin_campaign, enroll_in_linkedin_campaign, create/publish/delete_linkedin_post, create/publish/close_linkedin_job → linkedin:write (pause/resume also need campaigns:write)
These are enforced by our systems at the MCP layer. Your underlying LinkedIn daily/weekly caps and warmup pacing are enforced separately by the scheduler — MCP cannot bypass them.
Pricing: MCP access is included with any active WarmySender subscription. No separate charge. Your API key usage counts toward the rate limits above.
Next Steps: See the guide "MCP Server — Install in Claude Desktop / Claude Code / Cursor / Windsurf / Zed" for copy-paste install snippets for each client. See "MCP Server — Available Tools Reference" for the full list of 60 tools. See "MCP Server — Safety, Scopes, and Rate Limits" for security and limits deep-dive.
Step-by-step install snippets for every MCP-compatible AI client. The WarmySender MCP server lives at https://warmysender.com/mcp and authenticates with your existing API key (ws_ prefix).
Before You Start — Create an API Key:
Go to Settings > API Keys > Create API Key.
Name it (e.g., "Claude Desktop" so you can revoke per-client later).
Select scopes — match them to what you want the AI to do. For full access pick everything; for read-only monitoring pick only the *:read scopes.
Copy the full key (shown once, starts with ws_). Keep it somewhere safe.
Claude Desktop (Mac / Windows): Claude Desktop natively speaks stdio MCP, not HTTP — so we use the npx mcp-remote bridge to adapt. Open (or create) your claude_desktop_config.json: • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json • Windows: %APPDATA%\Claude\claude_desktop_config.json
Paste this block inside the top-level object (merging with any existing mcpServers):
Replace ws_YOUR_API_KEY_HERE with your real key. Save the file, fully quit Claude Desktop (Cmd+Q, not just close the window), reopen. You should see "warmysender" listed under the MCP section of the tools menu. Try asking: "What LinkedIn campaigns do I have running?"
Claude Code (CLI): Claude Code speaks HTTP MCP natively. Run:
Testing Your Connection: From any client, ask the AI: "Use the get_workspace_info tool to show me my current WarmySender workspace." You should get a JSON response with your workspace name, subscription tier, and the scopes on your API key. If you get an auth error, check that you replaced the placeholder with your real ws_ key. If the tool isn't listed, the client didn't connect — re-check the config file path and restart the client fully.
You should see a Mcp-Session-Id response header and a successful init payload. If curl shows 401, the key is wrong or revoked. If it shows 429, you've hit the rate limit — wait a minute.
Revoking Access: If you lose a device or want to cut an AI client off: Settings > API Keys > find the key you named after that client > Delete. The client's next call will get 401 immediately. You can always create a new key to re-enable.
Troubleshooting:
"Auth failed" — double-check your key starts with ws_, wasn't truncated, and isn't revoked (Settings > API Keys).
"Tool not found" — the client didn't pick up the config; fully quit and reopen.
"Rate limited" (429) — wait ~60s; you hit 120 reads, 30 writes, 10 LinkedIn writes, or 5 bulk ops in a minute.
"Insufficient scope" — the action needs a scope your key doesn't have. Edit the key's scopes in Settings > API Keys (or create a new one) and reconnect.
Claude Desktop still not seeing the server — check that npx is on your PATH (Node.js must be installed). Try running the mcp-remote command manually in Terminal to see errors.
See also: "MCP Server — Available Tools Reference" and "MCP Server — Safety, Scopes, and Rate Limits."
The WarmySender MCP server exposes 60 tools, grouped into eight capability areas: cold email & prospects, tracking domains, LinkedIn (campaigns, posts & recruiter), Instagram DMs, warmup & mailboxes, email verification, leads database, and workspace & jobs. Every tool enforces workspace scoping from your API key (ws_ prefix) — you can only see and touch data in your own workspace. Every LinkedIn and Instagram action is handed to our scheduler, which paces it within your account's safe ramp and daily/weekly caps; no tool sends outreach directly.
COLD EMAIL & PROSPECTS — 16 tools:
Campaigns:
create_campaign — Draft a campaign with name, steps, mailboxes, sending window, daily limits, tracking, and stop-on-reply/bounce/unsubscribe. Requires campaigns:write.
update_campaign — Partial update; allowed on draft or paused campaigns. Requires campaigns:write.
start_campaign — Move a draft to running (or scheduled if the start date is in the future). Requires campaigns:write.
pause_campaign — Running to paused; marked destructive so clients confirm first. Requires campaigns:write.
resume_campaign — Paused to running, re-scheduling pending enrollments. Requires campaigns:write.
list_campaigns — List email campaigns, filter by status, cursor-paginated. Requires campaigns:read.
get_campaign — Full details and live counters (sent, delivered, opened, clicked, replied, bounced). Requires campaigns:read.
update_prospect — Partial update of any field, including global status. Requires prospects:write.
bulk_create_prospects — Up to 500 per call with skip-duplicates; returns per-row status. Requires prospects:write.
list_prospects — Search and filter prospects, cursor-paginated. Requires prospects:read.
get_prospect — Full prospect detail including custom fields, list memberships, and enrollment summary. Requires prospects:read.
Enrollments & suppression:
enroll_prospects — Add prospects to an email campaign by ids, list ids, or emails (max 500 total). Suppressed prospects are auto-skipped. Requires enrollments:write.
create_linkedin_campaign — Create a connection or message campaign; the scheduler owns every send. Requires linkedin:write.
start_linkedin_campaign — Launch a LinkedIn campaign; actual invites and messages are paced by ramp week and per-account caps. Requires linkedin:write.
pause_linkedin_campaign — Pause a running campaign (a pure status flip); marked destructive. Requires linkedin:write (+ campaigns:write).
resume_linkedin_campaign — Resume after checking the LinkedIn account is connected and healthy. Requires linkedin:write (+ campaigns:write).
enroll_in_linkedin_campaign — Queue prospects (by ids, audience, or LinkedIn URLs; max 500) — the scheduler gates the actual actions against caps. Requires linkedin:write.
Posts:
create_linkedin_post — Draft a LinkedIn post. Requires linkedin:write.
publish_linkedin_post — Publish or schedule a post through the same paced backend the app uses. Requires linkedin:write.
delete_linkedin_post — Remove a post you created. Requires linkedin:write.
Recruiter:
create_linkedin_job — Draft a recruiter job posting. Requires linkedin:write.
publish_linkedin_job — Publish a job posting (bounded by the same daily cap as the app). Requires linkedin:write.
close_linkedin_job — Close an open job posting. Requires linkedin:write.
Read:
list_linkedin_accounts — Connected LinkedIn accounts with strategy, ramp week, and current daily/weekly usage against caps. Requires linkedin:read.
enroll_in_instagram_campaign — Queue an audience into an Instagram campaign; the scheduler paces DMs within a safe daily and hourly budget. Requires instagram:write (+ campaigns:write).
list_instagram_accounts — Connected Instagram accounts with status. Requires instagram:read.
get_instagram_account_health — Per-account health and current usage against safe limits. Requires instagram:read.
list_instagram_campaigns — Instagram campaigns by status. Requires instagram:read.
get_instagram_campaign_stats — DM counters and results for a campaign. Requires instagram:read.
WARMUP & MAILBOXES — 5 tools:
update_warmup_settings — Change warmup enabled/mode/target daily volume for one mailbox. Requires warmup:write.
bulk_update_warmup — Apply the same warmup settings to up to 500 mailboxes asynchronously; returns a job id to poll with get_job_status. Requires warmup:write.
list_mailboxes — All connected mailboxes with status, warmup state, and top-level health. Never returns credentials. Requires mailboxes:read.
get_mailbox_health — Detailed deliverability health for one mailbox, with fix suggestions. Requires mailboxes:read.
get_warmup_stats — Workspace aggregate or per-mailbox detail: sent today, limit today, ramp progress, inbox rate, health score. Requires warmup:read.
EMAIL VERIFICATION — 3 tools (same safe pacing and allowance as the in-app verifier):
verify_email — Verify a single address. Requires verification:write.
submit_verification_batch — Submit a whole list for verification. Requires verification:write.
get_verification_result — Read the result of a verification. Requires verification:read.
LEADS DATABASE — 3 tools:
search_leads — Search 11M+ B2B leads by role, industry, and location; results are masked and searching is free. Requires leads:read.
save_leads — Save chosen leads into a prospect list (unmasks; uses your monthly allowance or lead credits). Requires leads:write.
export_leads — Export chosen leads with full contact details (same allowance or credits). Requires leads:write.
WORKSPACE & JOBS — 2 tools:
get_workspace_info — Your workspace id, name, subscription tier, the scopes on your API key, and MCP server version — handy for testing the connection. No scopes required (an authenticated key is enough).
Not Exposed (by design): No delete operations (no delete_campaign, delete_mailbox, delete_account — soft-cancel via pause/archive only). No direct send tools (no send-invite, send-message, view-profile, comment, or react — the scheduler is the only path to outreach, so ramp and caps always apply). No account connect/disconnect tools (prevents seat drain). No warmup ref-tag modification (protects your inbox filtering). Account safety always wins over speed.
Full schemas and live curl examples: warmysender.com/mcp
How the WarmySender MCP server keeps your account safe when you grant an AI assistant access. Read this before handing a production API key to any AI tool.
CORE SAFETY INVARIANTS:
1) Workspace scoping — every single query Your API key deterministically resolves to exactly one workspace at auth time. Every tool handler filters every database query by that workspace ID. A tool cannot be tricked via arguments into seeing or modifying another workspace's data. The workspace ID never appears in tool input schemas — there's no way for the AI to "pass" a workspace ID.
2) Scheduler-first for all LinkedIn + warmup actions MCP never calls our LinkedIn provider (LinkedIn API) directly. Tools like pause_linkedin_campaign, resume_linkedin_campaign, enroll_in_linkedin_campaign only flip database state or queue work. Our scheduler — the same one the UI uses — gates actual LinkedIn invites, messages, and profile views against: 4-week ramp schedule, per-account daily cap (invites + messages + profile views), per-account weekly cap (e.g., 200 invites/week for premium, 150 for free with notes), and our LinkedIn provider's published per-account API budget. A compromised or hallucinating AI client cannot bypass these — the enforcement is in the scheduler, not the tool.
3) No send tools at all No tool in the MCP catalog sends an email, invite, message, InMail, profile view, post comment, or reaction directly. The only way to make WarmySender do outreach is to start a campaign (which the scheduler then paces) or to enroll prospects in an already-running campaign (again, scheduler-paced). This removes an entire class of risk where an AI could be prompted into sending unintended messages.
4) No account connect / disconnect Adding or removing a LinkedIn or email account stays in the web UI behind your logged-in session. A compromised AI assistant cannot drain your LinkedIn seats or provision new accounts on your bill.
5) No delete operations in V1 No delete_campaign, delete_mailbox, delete_prospect, delete_account. Soft-cancel via pause/archive only. Permanent deletes happen in the UI with explicit confirmation.
6) Warmup subject-line ref-tag is untouchable Our warmup emails include a [ref: XXXXXXXX] tag in the subject so you can filter them from your inbox with a simple Gmail / Outlook rule. No MCP tool can remove or modify this tag — protects your inbox hygiene.
SCOPES — PRINCIPLE OF LEAST PRIVILEGE:
Your API key carries a list of scopes. Each tool requires specific scopes. Grant only what you need for the AI to do its job:
These are enforced in our systems at the MCP edge, independent of LinkedIn / warmup scheduler limits. Exceeding any category returns a 429 with retry_after_seconds.
IDEMPOTENCY: Every write tool supports an optional idempotency_key argument. If the AI retries the same operation (same tool, same args, same key) within 24 hours, you get the original result back — no duplicate effect. Different args with the same key return 409 idempotency_conflict.
AUDIT LOG: Every tool call is logged to our system_logs table with: tool name, workspace ID, API key ID, duration, outcome (ok / error / rate_limited / insufficient_scope), and a sanitized args summary (never full emails, names, phone numbers, or URLs — only hashes, domains, and counts). If something goes wrong, our support team can trace exactly what the AI tried to do.
TRANSPORT SECURITY:
TLS 1.2+ only (HTTPS enforced at the edge).
Bearer token auth — your API key (ws_ prefix, SHA-256 hashed server-side). Never sent as a query parameter, never logged.
Session IDs bound to the API key at initialize time — a confused-deputy attack where a stolen session ID is reused with a different key is rejected.
DATA THE AI NEVER SEES:
SMTP / IMAP passwords, OAuth refresh tokens for your mailboxes.
Stripe / billing details.
Other workspaces' data — ever.
User login credentials / session cookies.
RED-TEAM TESTS WE RAN:
Try to access another workspace by passing a forged ID in tool args — blocked (args never carry workspace ID).
Try to exceed rate limits by opening multiple MCP sessions with the same key — blocked (limits are per-workspace, not per-session).
Try to call write tools with a read-only key — blocked (-32001 insufficient_scope, message lists exactly which scope is missing).
Try to retrieve mailbox credentials via list_mailboxes — blocked (response shape explicitly omits credential fields).
Try to bypass LinkedIn daily caps by spamming enroll_in_linkedin_campaign — the scheduler still paces actual invites regardless of enrollment queue depth.
DISABLING MCP COMPLETELY: MCP has no global kill switch — the controls are per-key: Settings > API Keys > Delete every key. With zero API keys, no MCP client can authenticate. You can always re-enable by creating new keys.
QUESTIONS? If you need a scope combination not listed, or a tool that isn't in our catalog, contact [email protected] — we extend the server carefully (safety first), but legitimate requests are welcome.
See also: "MCP Server — Overview" and "MCP Server — Install in Claude Desktop / Claude Code / Cursor / Windsurf / Zed" and "MCP Server — Available Tools Reference."
When someone fills out a form on your website — a demo request, a newsletter signup, a lead-magnet download — you can have WarmySender add them as a lead AND drop them straight into a cold email campaign, automatically. No spreadsheet exports, no manual copy-paste. This guide shows the simplest way to wire a form or popup to your campaigns.
The One-Call Recipe (Recommended): A single request creates the lead and enrolls it in your campaign at the same time. This is the same "save lead + add to campaign" action you see in the app, exposed for your form tools.
Step 1 — Create an API key • Go to Settings > API Keys > Create API Key. • Give it the 'prospects:write' scope (to create leads) AND the 'enrollments:write' scope (to add them to a campaign). You need both for the one-call recipe. • Copy the key — it's shown once and starts with ws_. Keep it somewhere safe (a password manager or your automation tool's secret store). Never paste it into public code.
Step 2 — Grab your campaign ID • Open the campaign you want new leads to flow into. The campaign ID is in the page URL. You'll paste it as enrollInCampaignId below.
That's it. The lead is saved (201 for a brand-new lead, 200 if that email already existed) and added to your campaign in the same call. The response includes an 'enrollment' object so you can confirm what happened: { "data": { "id": "...", "email": "[email protected]", "firstName": "Jane",... }, "alreadyExisted": false, "enrollment": { "enrolled": true, "enrolledCount": 1, "warnings": [] } }
Good to know about enrollInCampaignId:
It's optional. Leave it out and the call simply creates/updates the lead with no campaign step (the response won't include an 'enrollment' object) — perfect if you just want to collect leads now and enroll them later.
Your lead is always saved, even if the enrollment part can't proceed. If something's off (for example, the key is missing the enrollment permission, or the campaign ID doesn't match one of your campaigns), you still get a saved lead plus a short note in 'enrollment' explaining what to fix — the request never fails outright.
Re-sending the same email won't create duplicates — leads are matched by email address, so a returning visitor updates the existing record.
The Two-Call Alternative: Some tools prefer one action per step. You can split it into two requests: 1) Create the lead: POST https://warmysender.com/api/v1/prospects with body { "email": "[email protected]", "firstName": "Jane", "company": "Acme" }. Grab the returned data.id. 2) Enroll it: POST https://warmysender.com/api/v1/campaigns/YOUR_CAMPAIGN_ID/enrollments with body { "prospectIds": ["THE_ID_FROM_STEP_1"] }. You can also enroll by email instead: { "emails": ["[email protected]"] } (this matches leads that already exist in your workspace). Both requests use the same Authorization: Bearer ws_YOUR_API_KEY_HERE header. The enrollment endpoint needs the 'enrollments:write' scope.
Connecting a Popup or Form (No Code): Almost any form or popup builder can send a webhook when someone submits. Point that webhook at the one-call recipe above: • Zapier — Add a 'Webhooks by Zapier' action, choose 'POST', set the URL to https://warmysender.com/api/v1/prospects, add the Authorization and Content-Type headers, and map your form fields (email, firstName, lastName, company) plus a fixed enrollInCampaignId into the JSON body. • Make — Use the 'HTTP > Make a request' module with method POST, the same URL and headers, and a JSON body mapping your form fields. • n8n — Use the 'HTTP Request' node (POST), same URL and headers, body mapped from the trigger. • Any other tool — if it can POST a webhook with custom headers and a JSON body, it works. Tools like Typeform, Webflow, Framer, Tally, and most popup builders can do this directly or through one of the above. Tip: store your API key in your automation tool's credentials/secret manager rather than typing it into the step, so it's not visible to teammates.
The One Hard Requirement — Set the Campaign to Running: For emails to actually go out, the campaign you enroll into must be set to Running. New leads added to a draft, paused, or not-yet-started campaign are saved and queued, but no emails send until the campaign is Running. This is by design — it prevents accidental sends from a campaign you're still editing.
If the campaign isn't Running yet, the enrollment still succeeds and the response tells you exactly why nothing will send, in the 'warnings' array. For example: • Draft campaign → "Lead enrolled, but this campaign is still a draft — no emails will send until you set it to Running." • Paused campaign → "Lead enrolled, but this campaign is paused — emails resume when you set it back to Running." • Scheduled campaign → "Lead enrolled. This campaign is scheduled to start later, and emails will begin automatically at its start time." When the campaign is Running, 'warnings' is empty and your leads are picked up on the next send cycle. A simple pre-launch check: send one test lead and confirm 'enrolled' is true with an empty 'warnings' array.
What to Expect — Paced for Deliverability, Not Instant: New leads don't get emailed the instant they're captured, and that's a feature, not a delay. WarmySender sends within each campaign's sending window (the hours and days you chose), respects your daily sending limits, and follows your warmup ramp — so your volume stays in a range inbox providers trust. Blasting every new lead the second they sign up is exactly the pattern that lands senders in spam. By pacing sends, WarmySender protects your domain's reputation so more of your emails reach the inbox over the long run. Leads captured outside your sending window simply go out when the next window opens.
Leads that shouldn't be emailed (anyone on your suppression or unsubscribe list, or a hard-bounced address) are automatically skipped — they're still saved, but they won't be contacted. You'll see that reflected in the response counts.
Beyond Cold Email: This same lead-capture flow feeds your wider outreach. The leads you create can carry a LinkedIn profile URL (add a linkedinUrl field) so they're ready for LinkedIn outreach or multichannel campaigns too, and connected mailboxes stay protected by warmup the whole time. Cold email is the most common use for form-captured leads, so that's the focus here — but the same leads work across cold emailing, LinkedIn outreach, multichannel sequences, and email warmup.
Troubleshooting:
Lead saved but no email went out → check the campaign is set to Running (not draft or paused) and that the current time falls inside the campaign's sending window. Look at the 'warnings' array in the response for the exact reason.
Response says the enrollment permission is missing → your API key has 'prospects:write' but not 'enrollments:write'. Add the Campaigns enrollment permission to the key in Settings > API Keys, or create a new key with both.
Response says the campaign wasn't found → double-check the enrollInCampaignId value matches a campaign in this workspace (copy it again from the campaign's page URL).
Same person added twice → they won't be; leads are matched by email, so a repeat submission updates the existing lead instead of creating a duplicate.
Related Guides: 'Managing Campaigns via API', 'API Quickstart Tutorial', 'Zapier Integration', 'Make (Integromat) Integration', 'n8n Integration (Self-Hosted)'.
Connect any website form or popup — a newsletter signup, a demo request, a lead-magnet download — straight to WarmySender. When someone submits, the new lead drops into one of your lists, and if a Running campaign is linked to that list, the lead is enrolled automatically and your cold email sequence begins. No exports, no copy-paste. This is the list-based, always-on companion to 'Automatically email new leads from a form or popup' (which sends a lead into one specific campaign by ID).
The key is one extra value in the request: your list ID. Send a lead's email plus a listId, and WarmySender adds them to that list and folds them into whatever Running campaign you've linked to it.
How it works — three pieces:
A list — a saved audience in WarmySender. You point your form at it using its ID.
A Running campaign linked to that list — when a campaign is built from a list and set to Running, anyone added to the list afterward is enrolled automatically.
One API request from your form — on submit, your form tool posts the lead's email and the list ID to WarmySender.
Step 1 — Create an API key:
Go to Settings > API Keys > Create API Key.
Give it the 'prospects:write' permission (to create leads).
Copy the key — it's shown once and starts with ws_. Store it safely (a password manager or your form tool's secret store). Never paste it into public code. Paste it exactly, with no leading/trailing spaces or line breaks, or it will be rejected.
Step 2 — Find your list ID:
Open the Lists page and select the list you want new signups to land in (or create one). Its ID is what you send as listId.
Make sure a campaign built from this list is set to Running — that's what turns each new lead into an active recipient.
Step 3 — Send the request on submit (enroll defaults to true, so the lead is auto-enrolled into the linked Running campaign): curl -X POST https://warmysender.com/api/v1/prospects \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"email":"[email protected]","firstName":"Sam","listId":"YOUR_LIST_ID","enroll":true}'
The fields you send: • email (required) — the lead's email. The only required field. • listId — the ID of the list to add the lead to (from the Lists page). When a Running campaign is linked to that list, the lead is enrolled automatically. • enroll — defaults to true (auto-enroll into the linked Running campaign). Set it to false to add the lead to the list only, without starting any campaign. • firstName, lastName, company, role, phone (optional) — personalization details for merge variables. • linkedinUrl (optional) — a LinkedIn profile URL, so the lead is ready for LinkedIn or multichannel outreach too. Re-sending the same email won't create duplicates — leads are matched by email, so a returning visitor updates the existing record.
Reading the response — it confirms exactly what happened: { "data": { "id": "...", "email": "[email protected]", "firstName": "Sam",... }, "alreadyExisted": false, "listId": "YOUR_LIST_ID", "list": { "attached": true, "enrolledCampaigns": 1 } } • list.attached true = the lead was added to your list. • list.enrolledCampaigns = how many Running campaigns linked to that list the lead was enrolled into (1 or more means your sequence will start for them). • listId echoes the list you targeted (or null if you didn't send one). Your lead is always saved, even if the list step can't complete. If the list ID doesn't match one of your lists, you still get a saved lead plus a clear note (list.error 'list_not_found') — the request never fails outright. If you see that, copy the list ID again from the Lists page and update your form tool.
Changing the campaign later (without touching your form): Because your form points at a list rather than a specific campaign, you can swap the campaign any time — just link a new Running campaign to the same list. Your form keeps posting to the same list ID; new leads flow into whatever Running campaign that list is connected to now. (Prefer to send leads into one fixed campaign by ID? Use enrollInCampaignId — see 'Automatically email new leads from a form or popup'.)
Connecting a popup or form with no code: Most form/popup builders can send a request on submit, so you usually don't write any JavaScript and your API key stays out of the browser: • Zapier — 'Webhooks by Zapier' action, POST to https://warmysender.com/api/v1/prospects, add the Authorization and Content-Type headers, map your form fields plus a fixed listId into the JSON body. • Make — 'HTTP > Make a request' module, POST, same URL/headers, JSON body mapping your fields plus listId. • n8n — 'HTTP Request' node (POST), same URL/headers, body mapped from the trigger. • Any other tool that can POST with custom headers and a JSON body works — Typeform, Webflow, Framer, Tally, and most popup builders. Store your API key in your tool's credentials/secret manager rather than typing it into the step.
"Can I send them a file?" Campaign emails send links, not attachments. Host the file (your website, a file host, a cloud drive share link) and put the link in your campaign email — better for deliverability than attachments, and you can update the file later. Every enrolled lead gets the link as part of the sequence.
What to expect — paced for deliverability, not instant: new leads don't get emailed the second they sign up. WarmySender sends within each campaign's sending window, respects your daily limits, and follows your warmup ramp, so your volume stays in a range inbox providers trust. Leads captured outside your sending window go out when the next window opens. Anyone on your suppression/unsubscribe list or a hard-bounced address is automatically skipped — saved but not contacted. Account safety always wins.
For the full walkthrough with a JavaScript fetch example, see /documentation/add-leads-from-a-website-form. Related: 'Automatically email new leads from a form or popup', 'Create & Enroll Prospects with the API', 'API Quickstart Tutorial', 'Zapier Integration', 'Make (Integromat) Integration', 'n8n Integration (Self-Hosted)'.
Developer guide to the WarmySender REST API mailbox lifecycle: create, fetch, list, update, delete, and restore mailboxes. Create kicks off an async connection check (created → testing → connected). Delete is a soft delete that keeps warmup history, and re-adding a deleted email restores the existing mailbox instead of erroring — so an email is never stuck after deletion.
Full explainer: /documentation/managing-mailboxes-with-the-api
If you've checked Google Search Console (GSC) and your page is in the Coverage report under 'Excluded' instead of 'Indexed', this guide explains the four most common GSC bucket types in plain language, what causes each one, what WarmySender does on the platform side to prevent them, and a 5-step debug checklist you can run on your own site.
The four GSC bucket types you're most likely to see
1. 'Discovered — currently not indexed' — Google found the URL (usually from your sitemap or an internal link) but decided not to crawl or index it yet. The URL is in Google's frontier; it's just deprioritized. This is the most common bucket on programmatic SEO sites because Google's indexing decision rests on signals that suggest the page is worth crawling — internal-link weight, anchor-text relevance, proximity to high-authority pages, and content uniqueness. Sitemap inclusion alone is a *discovery* signal, not a *quality* signal. A URL that floats in the sitemap with no inbound internal links from the homepage, footer, or sibling content cluster reads to Google as 'low-priority candidate, defer indefinitely.'
2. 'Crawled — currently not indexed' — Google fetched the page, looked at it, and decided not to add it to the index. Common causes: thin or templated content (the page looks like a near-duplicate of others on your site or the wider web), low unique-text ratio (most of the page is boilerplate chrome — header, nav, footer — with very little body content), or the body content extracts to fewer than ~300 words. This bucket is harder to clear than 'Discovered' because Google has already formed an opinion; you need to substantively improve the page (more unique content, better structure, examples, FAQs, internal links to siblings) and then ask Google to re-evaluate.
3. 'Soft 404' — The page returned HTTP 200 (success) but the content reads as 'this page doesn't really exist.' Common causes: a placeholder template that says something like 'No items in this category yet,' an empty `<article>` body that renders only header and footer, a translated page where the translation pipeline left literal placeholder markers ('content would be here', `COMMENT_0`), or a catch-all SPA route that returns the homepage body for any unmatched URL with a self-canonical pointing to '/'. The fix is to return an actual HTTP 404 (or fix the content) — Google specifically guides that empty pages should 404, not 200 + noindex. 200 + noindex on an empty page is the worst of both worlds: the URL stays in Google's frontier and gets re-crawled forever, polluting your Coverage report.
4. 'Excluded by noindex tag' — The page returned HTTP 200 but its `<meta name="robots" content="noindex">` tag (or HTTP `X-Robots-Tag: noindex` header) told Google not to index it. This is correct for pages you genuinely don't want indexed (authenticated app pages, search result pages, paginated tail pages, gated content previews). It's a problem when the noindex was added accidentally — for example, a global SSR template that emits noindex on every fallback render path, or a hreflang-discovered locale URL where the locale doesn't actually have translated content but the SSR template falls through to noindex+200 instead of 404.
Common causes (across all four bucket types)
- Thin content (less than ~300 words of unique body text per page) - Weak internal-link signals (no inbound links from the homepage, footer, nav, or sibling content cluster) - Duplicate content (near-identical pages with the same intros, CTAs, or boilerplate paragraphs across many URLs) - Slow render or render-budget exhaustion (Googlebot times out before it gets your content) - Broken canonical tags (the URL canonicalizes to a different URL, so Google indexes the canonical instead — sometimes this is correct, sometimes it's an accident) - Sitemap pollution (the sitemap lists URLs that 404, redirect, or are noindex'd, telling Google your site is poorly maintained) - Hreflang mismatches (your hreflang alternates point to URLs that 404 or to pages that aren't real translations)
What WarmySender does on the platform side
WarmySender is a programmatic SEO site (we publish hundreds of comparison, glossary, feature, and guide pages) so we hit these patterns at scale. The platform applies several auto-protections to keep crawlable surface clean. Most are built into the SSR templates, the sitemap generator, and the publish pipeline:
- Related-articles auto-injection on every blog post and content cluster (so the long tail isn't orphaned in the link graph) - Placeholder content detection in the publish pipeline (translation-pipeline artifacts like `COMMENT_0` or 'content would be here' are caught pre-publish AND blocked at SSR-render time) - Canonical hygiene (each public URL has a self-canonical; legacy paths 301-redirect to the current location; the SSR catch-all returns 404 to crawlers for unmatched URLs instead of serving the homepage body) - Sitemap DB-pre-flight (every URL in our sitemap is backed by a real published row for that exact slug+locale — no speculative cross-products of locale × slug) - Localized index pages 404 when empty (rather than 200 + noindex, which pollutes the Coverage report) - Hreflang per-page discipline (we emit hreflang only for locales that actually have a published translation row for that exact URL)
These are general principles that apply to any programmatic SEO site — feel free to adopt them on your own.
For the canonical reference on Google's bucket types, see the official Search Console help center: https://support.google.com/webmasters/answer/7440203 (Page indexing report).
5-step debug checklist (for users running their own SEO)
If you're seeing pages in 'Discovered – not indexed', 'Crawled – not indexed', 'Soft 404', or 'Excluded by noindex tag' on your own site, run this checklist before assuming it's broken on Google's side.
1. Inspect the URL in GSC. Open Search Console → URL Inspection → paste the URL. Read what Google says about the URL's last-crawled date, the canonical Google chose, the indexed/not-indexed reason, and any errors. This is the highest-fidelity signal you'll get; everything below is supporting evidence.
2. Curl the URL with Googlebot UA. Run `curl -sI -A "Googlebot/2.1 (+http://www.google.com/bot.html)" <URL>` and confirm the HTTP status is 200, the `<meta robots>` tag (if any) doesn't say noindex, the `<link rel="canonical">` points to the URL itself (or the URL you intend Google to index), and there are no redirect chains. Then run `curl -s -A "Googlebot/2.1" <URL> | wc -w` and confirm the body has a real word count (>500 for a content page; >100 for a thin index/category page is a warning sign).
3. Check the link graph. Run `curl -s -A "Googlebot/2.1" <YOUR_HOMEPAGE> | grep -oE 'href="[^"]*"' | grep -c <YOUR_URL_PATH>` to confirm the URL has at least one inbound internal link from the homepage. Repeat for the footer, nav, and any high-authority hub page. If the URL is truly orphaned (zero inbound internal links), it will sit in 'Discovered – not indexed' indefinitely.
4. Check sibling content for near-duplicate boilerplate. If you have many pages with similar structure (comparison pages, glossary terms, listicles), check whether they share long verbatim passages — Google's near-duplicate clusterer drops most pages in a cluster and keeps one. Run a diff between two of your most-similar pages and look for paragraphs that repeat verbatim across both. Rewrite the shared sections to be page-specific.
5. Submit a re-crawl after fixing. In GSC URL Inspection, click 'Request Indexing' once you've made changes. For 'Discovered – not indexed' and 'Crawled – not indexed' specifically, expect 2-12 weeks for the bucket to clear even after fixes — Google indexes on its own schedule and the only way to speed it up is the sustained quality + link-graph signal, not repeated re-crawl requests. Re-submit your sitemap.xml in GSC after major content changes, and use the Coverage report's 'Validate Fix' button on each affected category to ask Google to re-evaluate the cluster.
When to ask support
If your pages on WarmySender (e.g., your authored blog posts, custom domain landing pages, or any feature you publish through the platform) are stuck in any of the four GSC buckets for more than 4 weeks after you've completed the 5-step checklist, email [email protected] with the affected URLs and your GSC screenshots. We'll dig into the specific render path and confirm whether the issue is on the platform side (something we should fix) or on your content side (where the 5-step checklist is the right path forward).
This FAQ explains how WarmySender pages get discovered, crawled, rendered, and indexed by Google and AI assistants. If you're curious why a specific page isn't showing up in search yet — or why a shared link's preview looks the way it does — read on.
How our SEO works in plain English
WarmySender uses a hybrid SSR + SPA architecture. When a search-engine crawler (Googlebot, Bingbot, ClaudeBot, GPTBot, PerplexityBot, etc.) visits a page, our server renders the full HTML server-side with all the right meta tags, structured data (JSON-LD), and content already in place. When a real human visits in a browser, we serve a lightweight app shell and the page fills in on the visitor's device, setting the page-specific title, canonical link, and Open Graph tags as it loads.
The server-rendered path is the canonical path for Google. Our crawler detection matches Googlebot, Bingbot, every AI crawler we've encountered, and social-share preview bots (Twitterbot, LinkedInBot, Slackbot, WhatsApp, etc.). Those user agents get the full SSR template every time.
The in-browser path is for human visitors. It replaces an older third-party library that had a subtle bug when the site's JavaScript was split into chunks, which could leave a page showing the wrong title or preview details. After the May 16, 2026 fix, every route in a real browser correctly displays its own page title, canonical link, and social preview details on every share.
Why pages don't appear in Google immediately
Indexing has four stages: Discovery → Crawl → Render → Index. Each stage can take days to weeks. A brand-new page typically takes 2-4 weeks to make it through, even with a healthy site. Common reasons a page is stuck:
Discovered, currently not indexed — Google knows the URL (via your sitemap, hreflang annotations, or external backlinks) but hasn't crawled it yet. This is normal for low-traffic sites or large sitemaps. The fix is patience, plus making sure the page has at least one strong internal link from an already-indexed page.
Crawled, currently not indexed — Google fetched the page but decided not to index it. This usually signals a quality concern: the content is thin (under 300 words), near-duplicate of another page, or doesn't have unique value over what's already indexed. The fix is content quality — make the page substantively different from competitor pages on the same topic.
What 'Discovered, currently not indexed' means on a WarmySender URL
For a WarmySender blog post or comparison page, this usually means one of three things: (1) the post is new and Google hasn't gotten to it yet (wait 2-4 weeks); (2) the post is in a low-priority section without strong internal links from your sitemap-included pages; or (3) Google flagged the post as low-uniqueness and chose not to index it relative to the competition. We monitor every page's indexing status in our admin dashboard.
What 'Soft 404' means
A Soft 404 means Google fetched a 200 OK response from the URL but the content didn't deliver what the URL implied. Common case on WarmySender: a localized URL like /it/blog/features that, prior to May 16, 2026, silently 301-redirected to /blog/features (English). Google followed the redirect, saw English content at a URL that promised Italian, and flagged it as Soft 404 because the locale was lost mid-redirect. Post-fix, those URLs return clean HTTP 404 when the underlying database has no Italian translations for that category — Google now sees an honest 404 and drops the URL from the discovery loop. See for the full evergreen pattern.
How i18n pages work
WarmySender supports 10 locales: ar, de, es, fr, it, ja, ko, nl, pt-BR, zh-CN. Each locale's category index page (/<locale>/blog/features, /<locale>/blog/compare, etc.) renders if at least one translated row exists in the database for that category and locale. If zero rows, the page returns 404 instead of redirecting to English. The sitemap is content-gated the same way — empty (locale, category) combinations are never advertised. When translations later ship, the page automatically starts returning 200 — the gate is data, not code.
Individual translated blog posts (/<locale>/blog/posts/<slug>) work the same way: they exist only when the database has a row for that (slug, locale) pair. hreflang annotations on the English version of each post point to siblings in every locale where a translation exists; locales without a translation are correctly absent from hreflang.
How to share a WarmySender page on LinkedIn or X correctly
When you share a URL on LinkedIn, X (Twitter), Slack, WhatsApp, or Discord, those platforms send a preview-bot to fetch the page and extract the og:title, og:description, og:image, and twitter:card meta tags. Because we serve crawlers and browsers from different paths, both paths now emit the same per-page og: tags after the May 16, 2026 fix. Pre-fix, every WarmySender URL shared on social media showed the homepage's generic preview ('WarmySender | Cold Email, Email Warmup, LinkedIn & Multichannel Outreach') because the broken Helmet library couldn't override the index.html defaults. Post-fix, the preview shows the actual article title and description.
If you're sharing a link and the preview looks wrong, check these in order: (1) the platform may be using a cached preview from before the fix — most platforms refresh after 24 hours; (2) the URL itself is correct (no typos that route to a different page or 404); (3) the page is actually indexed (paste it into Google's URL Inspection tool in Search Console to see what Google sees). If the og: tags look correct in the page source but the preview still looks wrong, force a refresh on the platform side (LinkedIn has a Post Inspector tool, X has Card Validator, Facebook has a Sharing Debugger).
What 'Page with redirect' means
A URL flagged as 'Page with redirect' means Google followed a 301/302 redirect from this URL to a different URL, and is now choosing to index the destination instead of the source. For WarmySender, this happens when an old URL (like /compare/warmysender-vs-instantly) redirects to its current canonical (/blog/compare/warmysender-vs-instantly). The redirect itself is correct and intended — Google is just being explicit that it has transferred indexing signal to the destination.
The related 'Page with redirect — Validation FAILED' status (which we cleared on May 16, 2026) means Google revisited the URL after a fix was claimed and still found it redirecting. The fix isn't 'remove the redirect' — that would break external links and bookmarks — it's 'remove every internal link to the old URL so Google stops re-discovering it via your own site'. An automated build check now blocks any future change that re-introduces an internal link to a legacy URL.
Reporting an SEO issue you spot
If you notice a page that should be indexable returning a 404, a sharing preview showing wrong information, or a page in Google that points at an old URL, please email [email protected] with: (1) the exact URL you visited, (2) the user agent (browser or share preview bot), and (3) a screenshot or HTML view-source of what you saw. We use these reports to extend the smoke test coverage — every confirmed issue becomes a new assertion in npm run seo:smoke so the same problem can't recur silently.
How WarmySender stays fast — a plain-language tour of how our public pages and the product surface are engineered for Google's Core Web Vitals, and how we keep them fast as the codebase grows.
Why page speed matters for you
Page speed isn't a vanity metric. It is a confirmed Google ranking signal since 2021, with the biggest impact on mobile rankings. Pages in the 'Poor' tier on Google's Core Web Vitals dashboard lose visibility in mobile search results — that means fewer of your prospects find your sales page, comparison pages, and credibility content when they search for tools like WarmySender. It also matters inside the product. Every dashboard load, every campaign-wizard step, every analytics chart, every unified-inbox switch is on the same engineering budget as our marketing pages. When we trim a hundred kilobytes from the entry bundle, that saving compounds across every screen you visit during a working session. Google publishes the formal CWV ranking documentation at developers.google.com/search/docs/appearance/core-web-vitals. The thresholds are simple — and we hold to them across every measured URL on the site.
How fast is WarmySender?
We target Google's 'Good' tier on all three Core Web Vitals metrics. These are field metrics — measured from real browsers on real devices — not lab synthetic numbers. Concretely, our targets are:
LCP (Largest Contentful Paint) — under 2.5 seconds on mobile, under 2.0 seconds on desktop. Measures how fast the biggest above-the-fold element renders. For the marketing pages on WarmySender, that element is the hero headline.
INP (Interaction to Next Paint) — under 200 milliseconds. The worst-case time between a tap or click and the resulting visual update. Replaced FID in March 2024 as the official responsiveness metric.
CLS (Cumulative Layout Shift) — under 0.1. Measures unexpected movement of page elements during load. Images, fonts, and async content are the usual culprits when CLS regresses.
What we did to get there (technical overview)
The biggest wins came not from adding more clever optimizations, but from removing weight from the parts of the site that load first. Four categories of fix:
Bundle splitting. Every below-the-fold marketing section (pricing, testimonials, FAQ, partner logos, etc.) is loaded on demand rather than statically included in the entry bundle. Known-heavy dependencies (animation libraries in particular) are split into their own named chunks so they get stable filenames and can be reused from cache across releases. Our React entry chunk is held under 400 KB.
CSS-first animations. Fade-in, slide-up, and other static reveals use CSS keyframes rather than a JavaScript animation library. CSS animation runs on the compositor thread, doesn't block the main thread during hydration, and ships zero kilobytes of JavaScript. We reserve JS animation for the small number of cases where the design genuinely needs interactive motion.
Font preload. We use the Inter typeface. Rather than load every weight upfront, we preload only the weights actually used above the fold and let the browser stream the rest as needed. Combined with matched fallback metrics, the swap from system font to Inter doesn't shift text — CLS stays well under the 0.1 threshold.
Lazy decorative components. Decorative animations (Lottie pieces, scroll-tracked flourishes, marquee logos) are loaded after the page is already usable. The page renders, becomes interactive, and then the decorative layer streams in. Visitors get to read and click immediately.
How we keep it fast (regression sentinels)
Speed regressions are easy to introduce — a single PR that adds a heavyweight dep to the eager import tree can quietly add 100+ kilobytes to every page load on the site. We catch these before they reach customers with three independent layers of defense:
Layer 1, build-time: a bundle-size gate that runs on every build and fails it if the entry JavaScript chunk grows past 400 KB. Any PR that accidentally pulls in a heavyweight dependency is caught before it merges — the fix is to lazy-load the component that imports it, or add the dep to the manual chunk configuration.
Layer 2, post-deploy: a PageSpeed Insights check that runs against the live site after every deploy and asserts the LCP on the most-trafficked URLs stays under the 2.5s mobile target. Uses Google's official PageSpeed Insights API, so the measurement is the same data Google would see when crawling your site.
Layer 3, real-user: [WEB-VITAL] telemetry from real browsers. A 1-in-100 sample of real browsers reports their measured LCP, INP, CLS, FCP, and TTFB back to our logging pipeline. Each line carries the URL, the connection type, and the metric value, so we can see regressions on real devices within minutes — not 28 days from now when Google Search Console would surface the field-data drop.
Where speed shows up in your daily use
Dashboard navigation: jumping between Campaigns, Mailboxes, Warmup, Analytics, Unified Inbox, and LinkedIn shouldn't ever feel like a page reload. We use client-side routing and aggressive prefetch so each subsequent screen is effectively instant after the first paint.
Campaign wizard load: the campaign wizard is one of the most-used surfaces in the product. We keep its bundle lean so opening a draft to edit one line doesn't make you wait for a 2 MB payload. Step transitions stay under 200 ms even on mid-range laptops.
Analytics charts: charts are notorious for ballooning bundle size — we lazy-load the chart library only on screens that actually render charts. Pages that don't need it never pay for it.
Unified inbox: conversation views are virtualized so a folder with thousands of messages opens and scrolls smoothly. Each message body is fetched on demand rather than upfront.
Reporting a slow page
If a specific URL feels slow to you — particularly on a mobile connection — please tell us. We treat performance regressions as bugs. Every confirmed regression gets a new assertion added to our smoke suite so the same class of issue can't silently come back. Email [email protected] with: the URL, your device and connection (e.g., 'iPhone 13 on 4G', 'MacBook on home Wi-Fi'), and a screenshot of the network panel or a PageSpeed Insights report for that URL, if you have one handy.
These are two very different things, and it's worth being sure which one you want. CANCELLING stops future billing — you keep full access to everything until the end of the billing period you've already paid for, nothing is deleted, and you can start again whenever you like. DELETING permanently removes your account and ends your access straight away, and it cannot be undone. Both are self-serve and take under a minute. If you only want to stop paying, cancel — that's almost always the right choice.
First, a quick check that saves a lot of regret If your dashboard looks empty, or you're being asked to choose a plan you're certain you already pay for, you may simply be signed in with a different email address than the one you subscribed with. It's easy to do — people sign up with a work address and later sign in with a personal one, or with a slightly different spelling, or with an address that forwards into the same inbox. Everything you set up is safe and waiting; it just lives under the other address. To check without deleting anything: compare the email address shown in Settings with the address on your billing receipt or card statement. If they differ, sign out and use the 'Try another email address' option on the sign-in screen — we'll send a sign-in code straight to that address so you can get into the right account.
How to cancel your subscription 1) Open the Billing page. 2) Find your current plan at the top — it shows which plan you're on and the date your current period runs to. 3) Click 'Cancel Subscription' (the button reads 'Cancel Trial' if you're still inside a free trial). 4) Read the confirmation — it tells you the exact date your access runs to — then confirm with 'Yes, Cancel'. You won't be charged again, and everything keeps working normally until that date. Nothing is deleted.
Changed your mind? Before the period ends, the Billing page offers to reactivate your subscription in one click and billing resumes as if you'd never cancelled. After the period ends you can subscribe again at any time.
Cancelling LinkedIn seats The LinkedIn add-on is billed separately and cancelled from the same Billing page — find the LinkedIn section and click 'Cancel Add-On'. Your LinkedIn accounts stay connected and campaigns keep running until the end of the period, then accounts disconnect and those campaigns stop. You can cancel the LinkedIn add-on on its own and keep your main plan running as normal. Cancelling your main plan also cancels the LinkedIn add-on at the same time, because the add-on needs an active plan behind it — the cancellation screen tells you before you confirm. The Instagram add-on works the same way.
How to delete your account (permanent) 1) Cancel any paid subscription or add-on seats first. Deletion is refused while billing is still live — that's deliberate, so nobody deletes an account and then keeps seeing charges. 2) Open the Danger Zone. It's in two places and both do exactly the same thing: Settings > Danger Zone > Delete Account, or Billing > Danger Zone > Delete Account. 3) Click 'Delete Account'. A confirmation window opens listing what will be removed. 4) Type your account email address exactly as it appears. The final button stays greyed out until it matches, so an accidental deletion is practically impossible. 5) Click 'Delete my account'. You're signed out immediately. If you still have paid time remaining, the confirmation window says so and offers to take you to cancel instead — deleting now ends the plan now, and the days you've already paid for aren't refunded.
What gets removed when you delete Your account and workspace including any team members, every connected mailbox, all campaigns and sequences with their history and statistics, all prospects and contact lists, all warmup history and settings, and everything else stored under the account. None of it can be recovered afterwards — export anything you want to keep first (prospects, campaign data and analytics all download as CSV). Deleting your WarmySender account doesn't touch your actual email accounts or your LinkedIn or Instagram profiles — those are yours, and we simply stop being connected to them.
What happens to your data afterwards Two different clocks: your access ends immediately, and your data is deleted within 30 days. That window covers routine removal from our systems and backups. We keep only the small amount of information the law requires us to, such as billing records. This matches our Terms of Service at /terms, which is the authoritative version.
Still not sure? Email [email protected] with your account email address before doing anything permanent — we answer within 24 hours on business days, and we'd much rather hear from you before a deletion than after one.
Full walkthrough with every step and an 8-question FAQ: /documentation/cancel-or-delete-your-account. Related: 'Upgrading or Changing Your Plan (Proration Explained)', /terms, /refund-policy.
Moving up to a bigger plan is instant, and you only ever pay for what you actually use. This guide explains exactly what happens to your bill when you upgrade, change, or downgrade your WarmySender plan — in plain language, with a worked example so there are no surprises on your card statement.
Upgrades take effect immediately
The moment you confirm an upgrade, the higher plan is live on your account. You get the new plan's limits and features right away — there's no waiting for your next billing date, no overnight processing, no temporary lockout. Pick the plan, confirm, and you're already on it.
You only pay the prorated difference today
When you upgrade in the middle of a billing cycle, you don't pay a fresh full month on top of what you've already paid. Instead, you pay only the prorated difference — the gap between your old plan and your new plan, counted just for the days remaining in your current cycle. That smaller, one-time amount is charged to your card on file today. After that, you're simply billed the new plan's normal monthly price on your usual billing date, the same date you've always renewed on. Nothing about your billing date changes — only the plan and the price going forward.
A worked example
Say you're on Pro at $14.99/month and you upgrade to Enterprise at $69.99/month about halfway through your billing cycle. You won't be charged the full $69.99 today. You'll pay only the difference for the days left in the cycle — roughly $27 today in this example — and then $69.99/month from your next billing date onward. The exact amount you see depends on how many days are left when you upgrade: upgrade early in the cycle and the prorated amount is larger; upgrade near the end and it's smaller. Whatever it works out to, the only thing you pay today is that difference, never a duplicate full month.
If a payment doesn't go through
If the card on file can't be charged for the prorated difference, nothing breaks and nothing is half-applied — your plan simply stays exactly as it was until the payment is sorted. You won't lose access to your current plan, and you won't be partially moved to the new one. Update your card or try again, and the upgrade will go through cleanly.
Downgrades and changing to a smaller plan
Moving to a smaller plan works a little differently: the change takes effect, and any credit for the value you'd already paid for is applied to your next invoice rather than refunded to your card. In other words, you don't lose what you've paid — it carries forward and reduces your next bill. As always, keep an eye on your usage when moving to a smaller plan so your account comfortably fits within the lower plan's limits.
Where to do it (and review before you confirm)
Open the Billing page, pick the plan you want, and review the summary before confirming. The summary spells out exactly what you'll pay today and what your new monthly price will be, so you can see the full picture before anything is charged. Confirm only when the numbers look right — there are no hidden steps after that.
FAQ
Q: Will I be charged a whole extra month when I upgrade mid-cycle? A: No. You pay only the prorated difference for the days left in your current cycle today, then the new plan's normal price on your regular billing date.
Q: Does my billing date change when I upgrade? A: No. Your renewal date stays the same. Only your plan and the price you pay going forward change.
Q: How is the 'difference' calculated? A: It's the gap between your old and new plan prices, counted only for the days remaining in your current cycle. Upgrade earlier in the cycle and the amount is larger; upgrade later and it's smaller.
Q: What happens if my card is declined when I upgrade? A: Your plan stays exactly as it is until the payment is sorted. Nothing is half-applied — update your card and try again.
Q: I downgraded — where's my refund? A: Downgrades apply the value you'd already paid for as a credit toward your next invoice rather than a refund to your card, so it carries forward and lowers your next bill.
Q: Can I see what I'll pay before confirming? A: Yes. The Billing page shows a summary with exactly what you'll pay today and your new monthly price before you confirm anything.
If an invoice on your account goes unpaid, your account pauses. Nothing is deleted, nothing is cancelled, and nothing needs rebuilding — settle the invoice and everything starts again on its own, usually within a minute.
What pauses: your cold email campaigns, your LinkedIn and Instagram steps, and your email warmup. Warmup pausing is worth knowing about — your mailboxes stop sending and receiving warmup mail until the invoice clears, then start again by themselves. A few days makes very little difference; a long gap is worth avoiding, because warmup is what keeps your sender reputation steady.
What does not change: mailboxes, LinkedIn and Instagram accounts stay connected. Prospects, sequences, templates, statistics and history are untouched, and replies still arrive in your inbox. When campaigns resume they carry on exactly where they stopped — nobody is re-enrolled, no step repeats, and we never fire a burst to catch up on the paused days.
How to clear it: open Billing. The outstanding invoice is named there — what it is for, its date and its amount — with a button to settle it, and a note saying whether your bank needs to approve the charge (a different card will not help) or the card needs replacing (a different card is exactly the fix).
Three billing terms worth knowing:
Plans are billed in advance, for the month ahead. That is why a failed renewal pauses you straight away, and why cancelling never cuts you off early — you keep the period you already paid for.
Add-on seats are not prorated. If you cancel a LinkedIn or Instagram seat part-way through a month, that month is payable in full and no partial refund is issued. In exchange the seat keeps working to the end of the period you paid for, and you can reactivate any time before then.
You are never billed for a period you were locked out of. If a subscription ends because a payment never went through, there is no charge for the time you had no access and no bill sent later.
Full explainer with worked examples: /documentation/what-happens-to-my-account-when-a-payment-fails
Your campaign is paused because an invoice on your account has not been settled yet. Nothing is lost, nothing is cancelled, and nothing needs rebuilding. Settle the invoice and your campaigns start sending again on their own, usually within a minute.
Where you see it: the campaigns list shows a visible amber chip reading 'Paused — an invoice is outstanding' on each affected campaign (hovering adds a one-line explanation), and the campaign's own page shows a banner with an Update payment method button. Your dashboard and Billing name the exact invoice — what it is for, its date and its amount — with a button to settle it.
What pauses alongside it: your LinkedIn and Instagram steps, and your email warmup. Nothing is deleted or disconnected, and replies still arrive in your inbox.
One thing that will not work: pressing Resume while the invoice is still outstanding — the campaign refuses to start. Settling the invoice is the only action that clears it, and once it is settled you do not need to press anything at all. Campaigns resume exactly where they stopped, at their normal pace; we never fire a burst to catch up on the days you were paused, because a sudden spike is exactly what damages a sender's reputation.
If you also pay for LinkedIn seats and those are up to date, campaigns in that workspace keep running while you sort out the other invoice. Warmup still follows your main plan, so it pauses either way.
Full explainer with a worked example: /documentation/why-is-my-campaign-paused-after-a-payment-issue
Your payment is safe, and the plan almost always switches over within a few seconds. The record of what you paid lives with the payment itself, not with what the dashboard happens to be showing, so you cannot lose money here and you will not be charged twice for sorting it out.
Three steps, in this order:
Refresh the page. The dashboard reads your plan fresh on every load, so wait about 30 seconds and refresh. This resolves the overwhelming majority of cases.
Open Billing. Your current plan and your invoices are listed there. Anything genuinely unpaid is named at the top — what it is for, its date and its amount — with a button to settle it, and a note saying which of three things is holding it up: your bank needs to approve the charge, the card was declined, or the payment is still being processed. These are not interchangeable; if your bank has to approve it, adding a different card will not help.
Email [email protected] with the address on your account and roughly when you paid. Please do not pay again or open a second account — a duplicate account splits your billing history and makes it slower to fix.
This is not a billing pause, and the difference matters. A plan that has not switched over yet takes nothing away: your account keeps exactly the access it already had until the new plan lands on top of it. An unpaid invoice is the opposite — it actively stops your cold email campaigns, your LinkedIn and Instagram steps, and your email warmup until it is settled. If Billing names an outstanding invoice, see /documentation/what-happens-to-my-account-when-a-payment-fails.
Full explainer with worked examples: /documentation/post-purchase-troubleshooting
Bought WarmySender on AppSumo? Redeeming your code activates your lifetime plan in under a minute — there's no password to create and nothing to set up first.
How to redeem (4 steps):
In your AppSumo account, open WarmySender and click Activate (some deals label the button Redeem). This carries your code across for you — you never copy, paste, or type it anywhere.
You'll land on a short activation screen. Sign in with Google, Apple, or a one-time email code (we email you a 6-digit code). No password needed.
Your lifetime plan unlocks instantly — your tier's warmed and cold mailboxes, monthly sending allowance, leads, and email verifications are all ready to use right away.
First time in? Take the 60-second product tour, connect your first mailbox, and switch on warmup.
Already have a WarmySender account? Sign in with it on the activation screen and your code links to that account — your existing mailboxes, campaigns, warmup history, and prospects stay exactly where they are. One code links to one account, and going through activation twice never doubles anything up.
Changing your tier: manage it on AppSumo. Move up or down a tier from your AppSumo account and your WarmySender plan updates automatically to match — there's nothing to re-activate on our side.
What's included: a full WarmySender plan — email warmup on a set of mailboxes, cold email campaigns with a monthly sending allowance, a built-in B2B leads database, and email verification. Higher tiers include more mailboxes, more sending, more leads, and more verifications, plus room for extra workspaces and teammates. LinkedIn and Instagram outreach are optional paid add-ons you can add anytime from inside the app.
Refunds: if you refund your purchase on AppSumo, your WarmySender access ends once the refund is processed.
Which email should I use? Any email you like — sign in with the one you want your account under. If you already have a WarmySender account, use that so everything stays in one place.
For the full walkthrough with FAQs, see /documentation/how-to-redeem-your-appsumo-code.
Short answer: someone who signs up through your affiliate link appears in your referral list right away — but earnings only begin once they purchase a paid plan. Seeing referrals next to $0 earnings usually just means your referrals haven't upgraded yet, not that anything is broken.
When a referral appears The moment someone creates a WarmySender account after clicking your link (within 60 days of the click), they're credited to you as a referral and show up on your Affiliate Program page. At this point they may still be exploring on a free account — no money has changed hands yet, so there's nothing to earn a commission on.
When earnings begin Your commissions start when a referral becomes a paying customer. From their first plan payment onward, you earn 50% of every plan payment they make, net of payment processor fees, for their first 12 months as a paying subscriber. Commission is on plan payments only — add-ons such as LinkedIn are not commissionable.
When you can withdraw Each commission becomes available to withdraw after a 45-day holding period (this covers the refund window — if a payment is refunded, the matching commission is reversed). Once your available balance reaches the $100 minimum, you can request a payout from the Affiliate Program page.
Track each referral's status Your affiliate dashboard shows every referral individually — a masked email for privacy, plus whether they've upgraded to a paid plan yet — alongside your personal funnel from clicks to signups to paying customers. So you can always see exactly where each referral stands and why your earnings are what they are.
A typical timeline 1) Someone clicks your link and signs up — they appear as a referral immediately. 2) Days or weeks later they upgrade to a paid plan — your first 50% commission is recorded. 3) 45 days after that payment — the commission becomes available to withdraw. 4) Your available balance passes $100 — request a payout from the Affiliate Program page.
For the full guide — worked examples, payout methods, and program terms — see /documentation/how-the-warmysender-affiliate-program-works.
How many mailboxes can you attach to WarmySender on each plan? Pro 50, Enterprise 400, Ultimate 800 — account-wide, shared across your workspaces. Unlimited warmup on every plan. This page covers what counts toward the cap, what happens on downgrade, the grandfathering policy for existing customers, agency math when you have multiple workspaces, and answers the most common questions about mailbox limits.
Some AI tools let you add WarmySender as a custom connector. You give the tool the WarmySender address, a WarmySender approval screen opens, you sign in with your normal WarmySender account and approve it — and from then on you can run your outreach by chatting with the agent.
If you tried this before 28 July 2026 and kept being returned to your dashboard without the approval screen ever appearing, please try again — that was a fault on our side, not anything you did, and it is fixed. The approval screen now appears and the connection completes.
Once connected, an agent can create, launch and manage campaigns across cold email, LinkedIn and Instagram, add and enrol prospects, verify email addresses, and set up warmup — all in plain language. It never sends a message, invite or DM directly and it can never raise a limit: it hands the work to WarmySender's scheduler, which paces every action inside safe limits no matter who asked for it. Connecting and disconnecting accounts always stays in the app.
If you would rather skip the sign-in screen entirely, you can connect with a workspace key instead — see the AI Agents page for both routes.
Full explainer: /documentation/connecting-an-ai-agent-that-asks-you-to-sign-in
This error usually means you're using your regular Google password instead of an App Password. Google requires App Passwords for third-party applications when 2-Step Verification is enabled. Go to myaccount.google.com/apppasswords, generate a new App Password, and use that 16-character password in WarmySender instead of your regular password.
This error indicates the wrong SMTP or IMAP host or port is being used. Double-check the server settings for your email provider in the Provider Setup Guides above. Common mistakes include using port 587 with SSL (should be STARTTLS) or port 465 with STARTTLS (should be SSL). Make sure there are no typos in the hostname.
A "Mailbox full" notice means that mailbox has reached the storage limit set by your email provider, so your provider can't deliver anything new into it until space is freed up. This is a STORAGE problem — not a reputation problem, not a spam problem, and it does not mean your domain is blocked or blacklisted anywhere. It's most common on smaller email hosting plans, where one plan's storage is shared across many mailboxes and each address gets a fairly modest allowance.
Why warmup stops: warmup is a two-way exchange — your mailbox needs to receive friendly warmup emails as well as send them, and that's what builds your reputation. When the mailbox is full, incoming warmup mail can't be delivered, so warmup can't do its job. Your warmup progress is paused, not damaged: it's all kept, and warmup resumes from exactly where it left off once there's room again.
What WarmySender does automatically: warmup emails are cleared out of your inbox — and your spam folder — about a day after they arrive, so warmup mail can't build up there over time. On hosting mailboxes — the ones where storage limits actually bite — they're removed for good, so the space is genuinely freed; on Gmail and Google Workspace they're filed away out of your inbox instead, and those accounts come with far more room so running out of space is rare. There's nothing to set up, and your real mail and campaign replies are never touched. Two honest limits: (1) this stops warmup mail from adding to the problem — it doesn't empty a mailbox that's already full of your own accumulated mail; (2) your Sent folder is deliberately left alone. We never file warmup into Sent ourselves, but Gmail, Outlook and Microsoft 365, Yahoo, AOL and iCloud all keep their own copy of everything sent from your mailbox, and those copies do count toward your storage. We don't delete them because Sent also holds your real campaign sends — to clear them yourself, search Sent for [ref: and delete or archive the results. Full explainer: /documentation/why-warmup-emails-appear-in-your-sent-folder
What to do: (1) Free up space — sign in to that mailbox's webmail, empty the trash/bin folder first (deleted mail often still takes up space until the folder is emptied), empty the spam/junk folder, clear out old mail with large attachments (a few big attachments can take more room than thousands of plain messages), and check your sent folder, which grows quietly. (2) Or increase the mailbox's storage — most providers let you raise storage on an individual mailbox or move to a plan with more room. That's a setting on your provider's side, and it's the fix that sticks if the same mailbox keeps filling up.
Once there's room, everything resumes on its own and the notice clears by itself — no need to remove and re-add the mailbox, re-enter your password, or toggle warmup off and on. Your other mailboxes are unaffected, campaigns rotate to your other healthy mailboxes, and LinkedIn and Instagram outreach carry on regardless.
Full explainer with a worked example and FAQ: /documentation/why-is-my-mailbox-full
This error means your email provider's administrator has disabled SMTP authentication at the organization level. This is common with Microsoft 365 accounts and is NOT a password issue — regenerating your App Password will not fix it.
Error codes you may see:
5.7.139 — SMTP client authentication disabled for the tenant/organization
5.7.57 — Client not authenticated, SMTP AUTH disabled
5.7.3 — Authentication unsuccessful, SMTP AUTH blocked by policy
'Basic authentication is disabled' — Security Defaults are enabled in your org
How to fix (requires your IT admin):
For Microsoft 365:
Your admin must go to Microsoft 365 Admin Center (admin.microsoft.com).
Navigate to Users → Active Users → Select your account.
Click the Mail tab → Manage email apps.
Check the box for 'Authenticated SMTP' and save.
Wait 15-30 minutes for the change to propagate.
If your organization has Security Defaults enabled (common for new M365 tenants):
Your admin must go to Azure Portal (portal.azure.com) → Microsoft Entra ID → Properties.
Click 'Manage Security Defaults' at the bottom.
Set 'Security defaults' to Disabled (note: this reduces security for the entire org — discuss with your IT team).
Alternatively, create a Conditional Access policy that exempts SMTP AUTH from MFA requirements (more secure than disabling Security Defaults entirely).
For Google Workspace: This error is rare with Google, but if you see it: 1) Your admin must go to admin.google.com → Apps → Google Workspace → Gmail → End User IMAP/POP Access. 2) Ensure IMAP access is enabled for your organizational unit. 3) Check that 'Allow users to manage their App Passwords' is enabled under Security → Authentication.
Note: This is a server-side policy change that only your IT administrator can make. WarmySender cannot bypass organization-level security policies. Send your admin the steps above or forward them this guide.
This error means the SMTP or IMAP hostname you entered does not exist or cannot be resolved by DNS. The mail server address is incorrect.
Common causes:
Typo in the hostname — Double-check for misspellings (e.g., 'smpt.gmail.com' instead of 'smtp.gmail.com').
Using your domain instead of the provider's hostname — For example, entering 'mail.yourdomain.com' when you should use 'smtp.gmail.com' (Gmail) or 'smtp.office365.com' (Outlook).
Domain expired or DNS not configured — If using a custom domain, verify it has not expired and has valid MX records.
Temporary DNS issue — Try again in a few minutes. If persistent, try using a different network or contact your internet provider.
WarmySender protects your mailboxes from being unfairly paused due to misclassified bounces (NDRs). A bounce — also called a non-delivery report (NDR) — is a message a mail server sends back when delivery to a recipient fails. Some bounces are real (the address doesn't exist, the mailbox is full), and some are misleading (a retry-in-progress notice, a sender-side problem misreported as a recipient problem, a transient delay). The platform applies a 4-layer defense so that a single misclassified bounce cannot poison the global blocklist or cascade-pause warmup across many customer mailboxes that share the same recipient domain in their peer pool.
Why this exists — the bounce-cascade bug class
Before the 4-layer defense landed in May 2026, a single misclassified bounce reported by one sender mailbox could trigger this chain: (1) the inbox scanner sees a mailer-daemon NDR and routes it to the bounce classifier, (2) the classifier defaults the unrecognized severity to soft, (3) the soft-bounce tracker eventually promotes the recipient domain to the global blocklist, (4) every warmup mailbox at WarmySender that has the bouncing recipient domain in its peer pool is auto-paused, with 'recipient domain bouncing' shown as the reason. A retry-warning email (e.g. "warning: message X delayed 24 hours, still being retried") that should have been ignored could thus pause dozens of paying-customer mailboxes overnight. On May 15, 2026 we found 96 paying-customer mailboxes across 26 workspaces silently paused over 14 days from exactly this fingerprint. The 4-layer defense closes the bug class structurally.
Layer 1 — Sender-side error classifier
A send-time guard that runs before any bounce is attributed to the recipient's domain. It asks one question: is this error actually about the recipient, or is it about the sender's own setup? Sender-side problems — an unverified sending domain, a missing DKIM signature, a lookup failure on the sender's own mail host, or the sender's own provider throttling them — are classified as sender-side and are NEVER added to the recipient-domain blocklist. The check lives in one place, so no other part of the platform can accidentally bypass it.
Layer 2 — Retry-warning skip in the inbox scanner
Bounces are detected by reading the delivery notices that land in the sender's own inbox. Before any such notice is treated as a bounce, we scan its subject and opening text for retry-warning language: 'delayed N hours', 'still being retried', 'warning: message… delayed', 'delivery delayed', 'still trying to deliver'. If any of those match, the notice is skipped entirely — it never reaches the classifier, never increments the bounce counter, and can never lead to a blocklist entry. Retry warnings are transient delays that almost always succeed on the next attempt; they are not real bounces.
Layer 3 — N≥2 distinct-sender corroboration before any blocklist add
The structural evergreen fix. Even when a bounce IS terminal — the recipient's mail server genuinely rejected the message as undeliverable — the platform now requires at least two different sender mailboxes to report a bounce for the same recipient domain within a 60-minute window before any global blocklist entry is added. A single-sender bounce is tracked (so a second sender's bounce can corroborate it later) but is never acted on alone. This means one misclassified bounce, whatever its error pattern or severity, structurally cannot add a recipient domain to the global blocklist. Both the number of corroborating senders and the length of the window are configurable, and the tracking survives restarts; stale entries are pruned every 15 minutes so old reports can't corroborate a new one.
Layer 4 — Cascade-pause sentinel firing within 5 minutes
Every 5 minutes we count how many mailboxes have just been paused for a bouncing recipient domain. If more than five have been paused in that window, an internal alert is raised. The alert is throttled to once every 30 minutes so a legitimate large cleanup doesn't flood us. It is observation only — it never re-enables mailboxes on your behalf; turning warmup back on is always your decision. This guarantees that even if all three preceding layers somehow fail and a cascade of pauses begins, we see it within 5 minutes and can step in.
What this means for you
If your warmup is paused because a recipient domain was bouncing, that domain reached the global blocklist only after at least two separate senders corroborated it — it is a real, multi-sender-corroborated bounce signal, not a misclassification. Open Mailboxes → click the affected row to see the specific recipient domain. To re-enable: toggle warmup back on; the system will retry the recipient and re-add the domain to the blocklist if the bounce is still happening.
If you suspect a misclassification (e.g. a known-good recipient domain like google.com or microsoft.com appearing in your pause reason), email [email protected] with the mailbox ID and the recipient domain — we will check the corroboration trail and either confirm the bounce or remove the blocklist entry. The blocklist is per-platform (global), not per-customer; removing an entry helps all customers.
Pause reasons are surfaced in two places: the mailbox row on the Mailboxes page, and — during a wave of pauses — the Reconnect Required banner. A safety rule in our database rejects any pause that arrives without a reason, so you should never see a paused mailbox without one.
Companion docs
/documentation#mailbox-reconnection — the related Reconnect Required badge and banner explainer (for sign-in related pauses).
/documentation#bounce-shield — the optional workspace-wide bounce-rate protection on outbound campaign sends (separate from the warmup peer-pool blocklist described above).
You can connect HubSpot to WarmySender today. The connection runs on two building blocks included on every paid WarmySender plan: an open REST API (read and write your data) and real-time, signed webhooks (WarmySender tells you the instant a reply, send, open, or click happens). You wire those two sides to HubSpot with a no-code automation bridge — Zapier, Make, or n8n — or with HubSpot's own workflow webhooks, or a small custom endpoint.
Let's be upfront: WarmySender does NOT have a one-click native HubSpot app in the HubSpot marketplace yet. There's no 'Export to WarmySender' button inside HubSpot and no OAuth 'Connect HubSpot' toggle in WarmySender. The supported, fully documented path is API + webhooks + a no-code bridge — and it does what most teams need: pull your HubSpot contacts into WarmySender, and push WarmySender activity back onto your HubSpot records.
What you can do once it's wired up:
Import HubSpot contacts into WarmySender — bring a HubSpot list in as prospects, ready for a cold email campaign, a LinkedIn sequence, or a multichannel sequence.
Push WarmySender events back into HubSpot — when a prospect replies, opens, or clicks, log it on the matching HubSpot contact as an activity, or update a contact property (e.g. a 'last engaged' date).
Keep the two systems aligned — flag bounced or unsubscribed contacts in HubSpot so your CRM stays clean.
Why teams run HubSpot outreach through WarmySender:
Lowest price in the category — paid plans start at $14.99/mo, and API access is included on every paid plan (you don't pay extra for the connection).
Built-in email warmup and Bounce Shield — every mailbox you send from can be warmed up to build sender reputation, and Bounce Shield protects deliverability so your HubSpot-sourced campaigns land in the inbox.
Native LinkedIn multichannel — the same HubSpot contacts can be worked over email AND LinkedIn in one sequence.
An open API with real-time webhooks — read/write your data and get instant signed notifications you can route anywhere, including back into HubSpot. No lock-in.
The 3 steps (same whichever bridge you pick):
Step 1 — Create a WarmySender API key. In WarmySender, open Settings > API, create a key (name it something like 'HubSpot bridge'), and copy it somewhere safe. This is how your bridge reads and writes WarmySender data (e.g. creating prospects from HubSpot contacts). API access is included on every paid plan. Full reference: warmysender.com/docs/integrations.
Step 2 — Add an outbound webhook. In WarmySender, open Settings > Webhooks and create a webhook. Paste in the receiving URL from your bridge (Zapier/Make/n8n each give you one), pick the events you care about (reply, send, open, click, plus bounce and unsubscribe to keep the CRM clean), and save. WarmySender shows a signing secret once — store it; your bridge uses it to confirm each notification is genuinely from WarmySender. Use the test button to send a sample event end-to-end. Every webhook is HMAC-signed, and delivery is retried automatically if your endpoint is briefly unreachable.
Step 3 — Connect the two sides to HubSpot. Three supported options:
Option A (recommended) — A no-code bridge (Zapier, Make, or n8n). Create a flow that starts from a webhook (Zapier 'Catch Hook', Make 'Custom webhook', or n8n 'Webhook' node); paste that URL into your WarmySender webhook from Step 2. Add a HubSpot step (create/update contact, log a note/engagement, create a task). To go the other way — HubSpot into WarmySender — start a flow from a HubSpot trigger (e.g. 'contact added to a list') and add a step that calls the WarmySender API to create the prospect and enroll them in a campaign.
Option B — HubSpot workflow webhooks. HubSpot's own workflows can send a webhook to the WarmySender API when a contact meets a condition; point it at a small receiver that creates and enrolls the prospect.
Option C — A small custom endpoint. If you have a developer, stand up an endpoint that receives WarmySender's signed webhooks and calls the HubSpot API directly (and the reverse). Most control. Signing-secret verification and the full event list are in warmysender.com/docs/integrations.
Is there a native HubSpot app? (honest answer) — Not yet. No one-click marketplace app, no OAuth 'Connect HubSpot' button, no automatic background sync that mirrors every contact without you setting up a flow. What you get instead is more flexible: an open API and real-time signed webhooks you connect with the no-code tool you probably already use. A little setup once, then it runs on its own.
Why this is safe and reliable:
Signed notifications — every webhook is HMAC-signed; your receiver verifies the signature and rejects anything forged.
Automatic retries — a brief blip won't lose an event.
Scoped, revocable API keys — your key only touches your own workspace's data, and you can revoke it any time from Settings > API.
You stay in control of HubSpot — nothing is written to HubSpot except the steps you build into your flow.
No impact on sending — turning webhooks on or off doesn't change how WarmySender sends; warmup, Bounce Shield, and per-mailbox limits keep working the same.
Salesforce / Zoho — the same approach works for any CRM. WarmySender's API and webhooks aren't HubSpot-specific; Zapier, Make, and n8n all have Salesforce and Zoho connectors, so you wire them up the same way.
WarmySender offers three ways to connect a Microsoft 365 mailbox: Sign in with Microsoft (recommended, one click), App Password (when your admin has enabled SMTP authentication), and Custom IMAP/SMTP (for non-standard setups). This guide covers all three plus the most common gotcha — connecting many Microsoft inboxes back-to-back without accidentally re-connecting the same account every time.
Method 1: Sign in with Microsoft (recommended)
This is the fastest path and the one that works for almost everyone, including users who are not the tenant admin. Steps:
Open Mailboxes → click Add Mailbox.
Pick Sign in with Microsoft.
Type the email you want to connect (e.g. [email protected]). We use this to send you to the right Microsoft account and to verify after sign-in that the account you authorized actually matches.
Click Continue with Microsoft. Microsoft will always show you the account picker, even if you're already signed in.
Pick the account, allow the permissions.
You'll land back in WarmySender with a confirmation showing the exact email that got connected.
If the email that came back from Microsoft is not the one you wanted, we will refuse to bind tokens and tell you what happened — so you can sign out of Microsoft (or open an incognito window) and try again.
Why this is the best choice:
Works on any paid Microsoft 365 mailbox — no admin involvement needed for OAuth itself.
Tokens refresh automatically, so you don't get random disconnects.
Most secure — we never see your password.
Connecting multiple Microsoft mailboxes back-to-back
If you have several inboxes to connect (typical for agencies or teams managing many mailboxes for outbound), here's what to watch out for: your browser remembers the last Microsoft account you signed in to. If you connected your admin account first, every later click on Sign in with Microsoft can silently re-use that admin session — and you'll end up touching the same account over and over instead of adding new ones.
Three ways to avoid this:
Always type the target email in the Which email do you want to connect? field before clicking Continue. We pass it to Microsoft as a hint so the picker pre-selects the right account, and we check the email Microsoft returns to make sure it matches what you asked for. If it doesn't, we'll show you a clear error instead of silently linking the wrong account.
Click Sign out of Microsoft in the dialog before each connection. We provide a direct sign-out link right there. After signing out, when you click Continue with Microsoft, Microsoft will ask you to sign in fresh and you can pick the right account.
Use an incognito / private browser window for each connect. This is the most reliable method when you're connecting many mailboxes in a row — each incognito tab is a fresh session with no remembered accounts.
What if I see I connected the wrong account?
If you notice you've connected the wrong mailbox (e.g. the admin account instead of a secondary), open Mailboxes, click the wrong row, choose Disconnect. Then sign out of Microsoft (or open an incognito window) and re-add the correct mailbox via Sign in with Microsoft. The disconnected row can be removed safely; no data is lost on the Microsoft side.
Method 2: App Password (Microsoft 365)
Use this when you'd prefer not to grant OAuth, or when you have to connect via SMTP for a specific reason. Important: this method requires your Microsoft 365 administrator to enable Authenticated SMTP on your account first. Microsoft turns this off by default for new tenants, which is why App Passwords often fail with what looks like a wrong-password error even when the password is correct.
Steps:
1) Ask your Microsoft 365 administrator to enable Authenticated SMTP:
Open the Microsoft 365 Admin Center.
Go to Active Users, click the user.
Open the Mail tab and click Manage email apps.
Check Authenticated SMTP and save.
Microsoft propagates the change within a few minutes.
On your own Microsoft account, set up multi-factor authentication if you haven't already, then create an App Password at mysignins.microsoft.com/security-info.
In WarmySender, click Add Mailbox → pick App Password. Paste your email and the App Password. The SMTP and IMAP server settings are pre-filled correctly; leave them as-is unless you have a specific reason to change them.
Click Test Connection. If it succeeds, save.
If the App Password test fails with Authentication unsuccessful, the user credentials were incorrect, the password is usually fine — Microsoft means SMTP is still turned off for your account. We'll show you that exact message in WarmySender, plus a one-click Connect with Microsoft instead button that switches you to OAuth using the same email. That's usually the fastest path forward.
Method 3: Custom IMAP / SMTP
Use this only for non-standard Microsoft Exchange setups (e.g. on-premises Exchange, hybrid Exchange Online with a custom edge transport). Pick Custom IMAP/SMTP on the Add Mailbox dialog and enter your server details manually. Most Microsoft 365 customers don't need this — pick Method 1 or Method 2 instead.
Troubleshooting
Authentication unsuccessful (App Password) — almost always means Microsoft has SMTP turned off. Ask your admin to enable Authenticated SMTP (steps above), or switch to Sign in with Microsoft (one click, no admin action needed).
The wrong Microsoft account got connected — you were already signed in to Microsoft as a different account in your browser. Fix: disconnect the wrong mailbox, sign out of Microsoft (use the link in the connect dialog) or open an incognito window, then re-add the correct mailbox.
I don't see my new mailbox in the list after Microsoft sign-in — same root cause as above. Microsoft silently reused your existing session. Confirmation toast will now show the actual email that got connected; if it's not the one you wanted, follow the fix above.
My organization blocks third-party sign-ins — your Microsoft 365 tenant has an Enterprise Applications policy that blocks the WarmySender app. Ask your IT admin to allow it (Azure portal → Enterprise Applications → Consent and permissions → User consent settings, OR explicitly admin-consent the WarmySender app).
Free Outlook.com / Hotmail account — OAuth via Microsoft 365 doesn't apply to free personal Microsoft accounts. Use the App Password path instead (free Outlook.com accounts with 2FA support App Passwords at account.live.com/proofs/AppPassword).
What permissions WarmySender asks for
When you Sign in with Microsoft, we request: read your basic profile information (your email and display name), send email on your behalf (so we can run your campaigns and warmup), read your inbox (so we can detect replies, bounces, and warmup messages that landed). We never store your password and you can revoke access at any time from your Microsoft account.
Related guides
/documentation#mailbox-reconnection — when and how to reconnect an existing mailbox.
/documentation#auth-failed — the generic Authentication failed troubleshooting list.
/documentation#connecting-mailbox — overview for all mailbox types (Gmail, Microsoft, custom).
When you see a Reconnect Required badge on a mailbox — or the Reconnect Required banner on the dashboard — sending from that mailbox is blocked until you take action. This page explains exactly when WarmySender flags a mailbox for reconnection, what you should do, and what happens in the meantime.
First, the most important distinction: "Reconnecting…" vs "Reconnect required"
These two look similar but mean very different things, and customers often re-enter their password for the first one when nothing was actually wrong. Here is how to tell them apart at a glance:
"Reconnecting…" (nothing for you to do) — This is a brief, temporary connection slowdown reaching your email provider. It happens occasionally, especially when you have many mailboxes sending at once, and it can show on a mailbox that has been warming healthily for weeks. It is NOT about your password or your settings. WarmySender automatically keeps retrying and resumes on its own once your provider is reachable again — your warmup progress and history are kept. You do not need to do anything. Re-entering your password won't make it clear any faster, and replacing a working password risks introducing a real problem where there wasn't one. Just leave it; it usually clears by itself, often within a day or so. (There's an optional "Reconnect all" button on the warmup page if you'd like to nudge a re-check sooner — but it's never required.)
"Reconnect required" (action needed) — This is the real one. Your mailbox's saved credentials have actually stopped working — for example, you changed your email password or app password, two-step verification was turned on, or a sign-in was reset. Until you refresh the credentials, sending from that mailbox stays paused. The steps to fix it, by provider, are below.
Rule of thumb: a calm "Reconnecting…" status = leave it alone, it fixes itself. A clear "Reconnect required" prompt on a specific mailbox = follow the steps below for that mailbox. For more on the temporary "Reconnecting…" state, see the guide at /documentation/why-are-my-mailboxes-reconnecting.
When does a mailbox need reconnection?
A mailbox is flagged for reconnection when any of these conditions are true:
The mailbox status is needs_reauth — set when a recent send rejected your credentials (e.g., SMTP 535 5.7.8 or 534 5.7.14), when an OAuth refresh token was revoked, or when the M365 admin disabled SMTP AUTH at the tenant level.
The mailbox status is error AND the last error message indicates an authentication problem — e.g., "534-5.7.14 Please log in via your web browser" (Gmail requires re-authentication — generate a fresh App Password), "535 5.7.8 Authentication credentials invalid" (Zoho / IMAP password rejected), or "5.7.139 SmtpClientAuthentication is disabled for the Tenant" (Microsoft 365 admin must enable SMTP AUTH).
The structured pause reason is one of: auth_failure, auth_errors, tenant_smtp_disabled, provider_block, hostinger_reauth_required, mailbox_disconnected. These are written by the warmup engine, the campaign send pipeline, and the OAuth token refresh job when they detect an unrecoverable auth state.
Warmup is paused or in an error state AND the last error message is authentication-related. This catches mailboxes where warmup itself stopped sending because the provider rejected the credentials.
What should I do?
• On the Mailboxes page, click the Reconnect Required badge or open the affected mailbox's menu. The action you'll be prompted to take depends on the provider: - Gmail / Google Workspace: click Update credentials and paste a fresh App Password — Gmail connects with an App Password over IMAP/SMTP, not a Google sign-in. App Passwords are often invalidated by a password change or a security review. Generate a new one at myaccount.google.com/apppasswords (2-step verification must be on) and save. This typically takes a minute or two. - Outlook / Microsoft 365: click Reconnect with Microsoft to re-grant OAuth, or if the error is 5.7.139, ask your M365 administrator to enable Authenticated SMTP for your mailbox (see /documentation/smtp-tenant-disabled for the admin steps). - Custom IMAP/SMTP (Hostinger, Zoho, Yahoo, Fastmail, self-hosted, etc.): click Update credentials and paste a fresh password or App Password. For providers that require App Passwords (Gmail-via-SMTP, Yahoo, iCloud, Outlook personal accounts with 2FA), generate a new one from your provider's security settings and update the SMTP/IMAP password fields.
You can also use the dashboard's Reconnect Required banner. Click View all mailboxes and the Mailboxes page will open with the filter pre-applied to Needs Reconnect.
What happens in the meantime?
Warmup pauses immediately for the affected mailbox. The mailbox is removed from the peer pool so other WarmySender customers' warmup emails don't bounce off your dead credentials, which would otherwise hurt their sender reputation.
Active campaigns skip the affected mailbox for new sends. The campaign itself stays running; it just rotates to your other healthy mailboxes. If this is the only mailbox attached to a campaign, the campaign pauses until reconnection.
Inbox sync (replies, opens, bounces) pauses for the mailbox until credentials are restored. Once you reconnect, the next inbox-sync cycle picks up any unread mail that arrived during the gap.
No data is lost. The mailbox row, its warmup history, its campaign membership, and all events stay intact. Reconnecting restores everything.
How long does reconnection take?
For Outlook / Microsoft 365 (OAuth): typically under a minute end-to-end. Click the badge, complete Sign in with Microsoft, and the badge clears as soon as the next health check runs (within seconds).
For App Password / credential providers (Gmail, Hostinger, Zoho, custom IMAP): same — the new App Password is tested at save time and the badge clears immediately if the test send succeeds.
For the M365 tenant-disabled case (5.7.139): the badge clears within 60 seconds of your admin saving the Authenticated SMTP setting. Microsoft typically propagates the change in under a minute, but rare tenants take up to 30 minutes.
Note: WarmySender will never email you to reconnect a mailbox — the in-app surface is the source of truth. If you're worried about phishing, anyone asking you to "reconnect your mailbox" via email is not us. Always open warmysender.com directly to take action.
This error means the mail server rejected your username or password. You may see SMTP error codes such as 535 5.7.8 (Authentication credentials invalid), 535 5.7.3 (Authentication unsuccessful), 534 5.7.9 (Application-specific password required), or 534 5.7.14 (Please log in via your web browser first).
Common causes:
Using your regular account password instead of an App Password.
An expired or revoked App Password.
A typo in your email address or password.
SMTP authentication not enabled on your account.
Two-Factor Authentication (2FA) enabled without generating an App Password.
Provider-Specific Steps:
Gmail:
You must use an App Password, not your regular Google password.
Go to https://myaccount.google.com/apppasswords (2FA must be enabled first).
Generate a new App Password for 'Mail' and paste it into WarmySender.
Your username must be your full Gmail address (e.g., [email protected]).
Outlook / Microsoft 365:
Generate an App Password at https://account.live.com/proofs/AppPassword or via your M365 admin portal.
Ensure SMTP AUTH is enabled: In Microsoft 365 Admin Center, go to Users > Active Users > select the user > Mail tab > Manage email apps, and check 'Authenticated SMTP'.
If you recently changed your password, wait a few minutes for propagation.
Zoho:
If 2FA is enabled, generate an App Password at https://accounts.zoho.com/home#security/security_apppassword.
If 2FA is not enabled, your regular Zoho password should work.
Your username is your full email address.
SMTP host: smtp.zoho.com (or smtp.zoho.eu / smtp.zoho.in depending on your region).
Yahoo:
You must use an App Password. Go to https://login.yahoo.com/account/security and generate one under 'App Passwords'.
Your username is your full Yahoo email address.
Debugging Steps:
Verify your username is your full email address (e.g., [email protected]), not just the part before the @.
Re-generate a fresh App Password and paste it carefully — avoid trailing spaces.
Confirm the SMTP host and port match your provider's requirements (see Provider Setup Guides).
Log in to your email provider's web interface and check for any security alerts or prompts that need to be resolved.
If you recently enabled 2FA, any previously saved passwords are invalidated — generate a new App Password.
Try disabling and re-enabling SMTP access in your provider's settings.
Still Not Working? • Check your provider's status page for outages. • Try connecting from a different network (some corporate networks interfere with SMTP authentication). • Contact your email provider's support team and confirm that SMTP access with third-party apps is allowed on your account. • As a last resort, try a different email provider to isolate whether the issue is account-specific.
SSL/TLS certificate errors are among the most common connection issues. Here is a comprehensive guide to diagnosing and fixing them:
Error: 'Self-signed certificate' or 'DEPTH_ZERO_SELF_SIGNED_CERT' This means your mail server uses a certificate that is not issued by a trusted Certificate Authority (CA). Common with self-hosted mail servers, Plesk, cPanel, or shared hosting.
Solutions (try in order):
Check port and security match — This is the #1 cause. Port 465 requires SSL. Port 587 requires STARTTLS. They are NOT interchangeable. Using the wrong combination produces certificate errors.
Use your provider's official SMTP/IMAP hostnames — Do not use your domain name (e.g., mail.yourdomain.com) if your provider has official hostnames. For example, Hostinger users should use smtp.hostinger.com, not mail.yourdomain.com.
Check with your hosting provider — If you use shared hosting (Hostinger, Bluehost, GoDaddy, Namecheap, SiteGround), your mail server's SSL certificate may be on a different hostname. Ask your host for the correct SMTP and IMAP hostnames that match their SSL certificate.
Verify the certificate is not expired — Expired certificates cause 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' errors. Contact your hosting provider to renew the SSL certificate on your mail server.
If self-hosted (VPS, dedicated server) — Install a valid SSL certificate from Let's Encrypt (free) or another CA on your mail server. Most mail servers (Postfix, Dovecot, hMailServer) support Let's Encrypt certificates.
Check for hostname mismatch — The SSL certificate's Common Name (CN) or Subject Alternative Names (SAN) must match the hostname you are connecting to. If your certificate is for 'mail.hostingprovider.com' but you are connecting to 'mail.yourdomain.com', you will get ERR_TLS_CERT_ALTNAME_INVALID.
Use the hosting provider's shared hostname — Many shared hosts have a hostname like 'server123.hostingprovider.com' that matches their SSL certificate. Use that instead of your custom domain.
Ask your provider to add your domain to the certificate — Some providers can add your domain as a SAN entry to their mail server's SSL certificate.
Error: 'STARTTLS not supported' The server does not support STARTTLS on the port you chose. Switch to port 465 with SSL, or confirm your provider supports STARTTLS on port 587.
Error: 'Wrong version number' or 'SSL routines' You are using SSL on a STARTTLS port or vice versa. Port 587 = STARTTLS. Port 465 = SSL. Switch accordingly.
Still Not Working? • Try connecting from a different network (some corporate firewalls block SMTP ports). • Temporarily try port 25 if available (unencrypted, not recommended for production). • Contact your email hosting provider's support team and ask them for the exact SMTP host, port, and security settings that work with third-party applications. • As a last resort, consider migrating to a provider with proper SSL support (Gmail, Outlook, Zoho, Fastmail all have valid certificates).
Note: WarmySender requires a valid SSL certificate for secure email delivery. Self-signed certificates are accepted for connection but may cause intermittent issues. We strongly recommend using a properly signed certificate.
This error means the mail server could not find an account matching the username you provided. The server is reachable and accepting connections, but the specific mailbox does not exist or is not recognized.
Common Causes:
Wrong username format — Your username must be your full email address (e.g., [email protected]), not just 'john' or a partial address. This is the most common cause.
Typo in email address — Double-check for misspellings, extra spaces, or wrong domain (e.g., @gmial.com instead of @gmail.com).
Email account disabled or deleted — The account may have been suspended, deactivated, or deleted by your email provider or domain administrator. Log in to your provider's web interface to verify the account is active.
Alias vs. primary address — Some providers only accept the primary email address for SMTP login, not aliases or distribution group addresses. Try using your primary mailbox address instead.
Provider-Specific Notes:
Gmail — Your username is always your full Gmail or Google Workspace address.
Outlook/M365 — Use your primary email address, not a shared mailbox or alias. Shared mailboxes require special configuration by your M365 admin.
Hostinger — Use the full email address you created in Hostinger's email panel (e.g., [email protected]).
Zoho — Use the primary address from your Zoho Mail account. Make sure you are using the correct regional domain (zoho.com, zoho.eu, zoho.in).
Custom/self-hosted — Verify the account exists in your mail server's admin panel (Plesk, cPanel, etc.).
Debugging Steps:
Copy-paste your email address to avoid typos.
Log in to your email provider's webmail to confirm the account is active and accessible.
Check with your domain administrator that the mailbox has not been deleted or disabled.
If using a custom domain, verify that MX records are properly configured and pointing to the correct mail server.
It is normal for some warmup emails to land in spam during the first few days, especially for new mailboxes or domains. WarmySender's spam rescue feature automatically detects and moves these emails to your inbox, which trains email providers to trust your address. Give it 1-2 weeks for your reputation to improve. If spam placement persists after 2 weeks, check that your SPF, DKIM, and DMARC records are correctly configured.
If your warmup is enabled but you see very few or no emails being sent, check these common causes:
Mailbox Connection — Go to your mailbox and verify the status shows 'Connected'. If it shows an error or 'Disconnected', reconnect the mailbox.
Warmup Toggle — Make sure warmup is actually enabled for the mailbox (the toggle should be on).
Early Ramp Phase — If your mailbox just started warmup, the system begins with only 1-3 emails per day and gradually increases over time. This is normal and by design. Check your ramp speed setting.
Subscription Status — Warmup requires an active paid subscription. If your subscription expired or was cancelled, warmup is automatically paused.
Daily Limit Already Reached — If you are running campaigns alongside warmup, the combined volume may have reached your daily plan limit. Check your daily usage in the mailbox details.
Recovery Mode — If the system detected reputation issues, it may have auto-switched your mailbox to Recovery mode, which intentionally reduces volume. Check your warmup strategy in the mailbox settings.
Health Score Below Threshold — If your health score is very low (critical range), the system may temporarily reduce sending to protect your domain.
If none of these apply, try disconnecting and reconnecting your mailbox, then re-enabling warmup.
If your campaign is not sending emails, check the following: 1) Verify your mailbox is connected and showing a green status. 2) Check that your warmup health score is above 70 (campaigns may pause if deliverability is low). 3) Confirm your daily sending limit hasn't been reached for today. 4) Make sure your campaign status is 'Active' and not paused. 5) Check your sending schedule to ensure the current time falls within your sending window and on an active sending day.
If you see rate limiting errors, it means too many actions are being attempted in a short period. WarmySender enforces safety limits to protect your accounts: email campaigns respect per-mailbox daily limits, and LinkedIn actions are limited to 2 per minute per account. Solutions: 1) Reduce your daily sending volume. 2) Spread sending across more mailboxes using mailbox rotation. 3) For LinkedIn, reduce the number of concurrent campaigns per account. 4) Wait a few minutes and the system will automatically resume sending. Rate limits reset daily.
If your mailbox shows a red 'Disconnected' status: 1) Your password or App Password may have expired or been revoked — regenerate it from your email provider and update it in WarmySender. 2) For Gmail: if you recently changed your Google password, all App Passwords are revoked and need to be recreated. 3) For Outlook: App Passwords expire if not used for 90 days. 4) Check that 2-Factor Authentication is still enabled (required for App Passwords). 5) Your email provider may have blocked the connection due to suspicious activity — log into your email directly and check for any security alerts. 6) Go to Mailboxes, click the disconnected mailbox, and re-enter your credentials. The system will test the connection automatically.
When your daily or monthly sending limit is reached, campaigns pause automatically until the limit resets. Daily limits by plan: Pro ($14.99/mo) = 333 emails/day (10,000/month), Enterprise ($69.99/mo) = 3,333 emails/day (100,000/month), Ultimate ($199/mo) = 10,000 emails/day (300,000/month). Per-mailbox combined limits (warmup + campaigns) also apply. Solutions: 1) Wait until tomorrow when daily limits reset. 2) Upgrade your plan for higher quotas. 3) Add more mailboxes and use mailbox rotation to spread volume. 4) Reduce warmup volume to free up quota for campaigns. Check your current usage in the Billing page.
If connecting your LinkedIn account didn't go through, it's almost always a brief busy moment that clears within a few minutes — not a problem with your account. A failed attempt never uses up your LinkedIn seat, never creates a charge, and never affects your LinkedIn account, connections, or standing on LinkedIn; there's no half-connected state to clean up. When an attempt doesn't complete you'll see a short countdown before the next try — wait for it to finish and try once, rather than tapping connect repeatedly (rapid retries can briefly hold things up, so the calm approach is the quick approach).
Two ways to connect, safest first: (1) the browser-cookie method — RECOMMENDED and the safest, calmest option for your account: it uses the sign-in your browser already has, so LinkedIn doesn't need to run an extra security check (no verification code to chase) and nothing leaves WarmySender; paste a fresh li_at value with no spaces or quotes and copy the whole thing (a stray space or quotation mark is the most common reason it doesn't take). To find your cookie on a computer with Chrome or Edge: sign in to linkedin.com, press F12 (or right-click and choose Inspect), open the Application tab, expand Cookies and click https://www.linkedin.com, then copy the li_at value. (2) email + password — works too, but LinkedIn may ask for a verification code, which is normal; the cookie method usually skips that step. Verification codes are LinkedIn's ordinary security check (confirming it's you, like a sign-in on a new device), so enter the code promptly — they expire fast — and request a new one if it lapses.
If it keeps failing: sign in to linkedin.com in a normal browser tab first and complete anything LinkedIn shows you (a prompt or security check) — a connection can't finish while LinkedIn is waiting for you to clear something — then come back and try again, ideally with the browser-cookie method (the safest), making sure you're connecting the right account. Wait for the short countdown between tries.
Still stuck? Email [email protected] with roughly the time it happened and which method you used, and we'll look into it. Full explainer with a worked example and FAQ: /documentation/why-wont-my-linkedin-account-connect
If your LinkedIn account is restricted: 1) LinkedIn may have detected automated activity — the restriction is temporary (usually 24-72 hours). 2) Do NOT attempt any actions while restricted — let the cooldown expire. 3) WarmySender's circuit breaker automatically detects restrictions and pauses your LinkedIn campaigns. 4) After the restriction lifts, the system will automatically resume with reduced limits and ramp back up gradually over 4 weeks. To prevent future restrictions: keep daily connection requests under 20, personalize every invite note, avoid sending on weekends, and let the warmup ramp-up complete fully before increasing volume. If your account is permanently restricted by LinkedIn, you will need to appeal directly through LinkedIn's help center.
Low invite acceptance rates are common — typical acceptance rates range from 20-40%. To improve: 1) Always include a personalized note (up to 300 characters) — generic invites get ignored. 2) Mention something specific about the person's profile, company, or a shared connection. 3) Keep your own LinkedIn profile professional and complete. 4) Target relevant prospects — people in your industry accept more often. 5) If a prospect hasn't accepted within your campaign's 'Wait Accept' timeout, the campaign will move to the conditional branch (if configured) or stop for that prospect. 6) Use 'View Profile' as a first step before sending an invite — this creates a notification and increases acceptance rates.
Campaigns auto-enter cooldown when safety thresholds are exceeded. This protects your sender reputation. Triggers: 1) Bounce rate exceeds 5% (default threshold). 2) Spam complaints reach the configured limit (default: 3 complaints). Cooldown lasts 24 hours minimum. After 24 hours, the system checks if metrics have improved — if yes, the campaign resumes automatically; if not, cooldown is extended. To fix: 1) Check your prospect list quality — remove invalid or catch-all email addresses. 2) Verify your DNS records (SPF, DKIM, DMARC) are correct. 3) Lower your daily sending volume. 4) If bounce rate was the trigger, enable Bounce Shield in Settings to pre-validate emails. The campaign status will show 'Cooldown' in orange on your Campaigns page.
Common CSV import issues: 1) File must be UTF-8 encoded CSV with headers in the first row. 2) Maximum 10,000 rows per import — split larger files. 3) Required column: 'email' — rows without a valid email are skipped (unless they have a linkedinUrl, which creates a LinkedIn-only prospect). 4) Check column mapping — after upload, you map CSV columns to WarmySender fields (email, firstName, lastName, company, role, phone, linkedinUrl, website, country, city, industry). 5) Duplicates are automatically skipped — if an email already exists in your workspace, it won't be imported again. 6) Suppressed emails are skipped — check your blocklist in Settings. 7) Invalid emails (failing MX validation) are skipped. 8) For custom fields, prefix your CSV column headers with 'custom:' (e.g., 'custom:department'). Check the import job status for a breakdown of created, skipped, duplicate, and invalid counts.
Custom tracking domains require a CNAME DNS record pointing to track.warmysender.com. Common issues: 1) 'No CNAME record found' — You haven't added the DNS record yet, or it hasn't propagated. Add a CNAME record for your chosen subdomain (e.g., track.yourdomain.com) pointing to track.warmysender.com. 2) 'CNAME record points to wrong target' — Your CNAME points somewhere else. Update it to point to track.warmysender.com exactly. 3) DNS propagation can take up to 48 hours — try verifying again later. 4) Some DNS providers require you to enter the subdomain only (e.g., 'track') without the full domain. 5) Make sure you don't have conflicting A records on the same subdomain. After verification succeeds, select the tracking domain in your campaign settings to use it for open and click tracking.
If your campaign emails land in Promotions or spam: 1) Check DNS records — SPF, DKIM, and DMARC must all be configured correctly. Use a tool like MXToolbox to verify. 2) Reduce HTML and images — plain-text-style emails with minimal formatting have higher inbox placement. 3) Avoid spam trigger words — 'free', 'guarantee', 'act now', 'limited time' in subject lines. 4) Warm up your mailbox first — run warmup for at least 2-3 weeks before starting campaigns. 5) Keep your volume low initially (20-30 emails/day) and increase gradually. 6) Personalize every email — use merge tags so each email is unique. 7) Set up a custom tracking domain to avoid shared tracking domain reputation issues. 8) Monitor your warmup Health Score — if it drops below 60, pause campaigns and let warmup recover your reputation. 9) Use Bounce Shield to filter out invalid emails before sending.
WarmySender automatically adds a visible unsubscribe link to every campaign email — no setup needed. You do not need to add anything manually in the campaign editor.
What happens automatically:
One quiet line is added at the end of every campaign email — small grey text reading 'Sent by [your name] · [your company address] · Unsubscribe' (your name and address appear when you have set them). It reads like a normal sign-off, not a bulk-mail block
Gmail and Outlook also show their own one-click unsubscribe button next to your sender name. That works independently of the footer line, so a prospect always has a way out
No configuration required — this is always on for deliverability and compliance
When a prospect clicks unsubscribe:
They are immediately removed from all active campaigns in your workspace
Their status is set to 'unsubscribed' globally
They are added to your suppression list automatically
They will not receive any future campaign emails from your workspace
Campaigns with 'Stop on Unsubscribe' enabled (default: ON) immediately stop the sequence
Viewing unsubscribed contacts:
Go to your prospect list and filter by 'Unsubscribed' status
Unsubscribed prospects remain in your database but are excluded from all sending
Compliance:
This is required for CAN-SPAM and GDPR compliance
Never manually re-add unsubscribed contacts to campaigns
Every unsubscribe link is signed, so it cannot be forged or guessed by anyone else
Outlook / Microsoft 365 connect with OAuth (Sign in with Microsoft); Gmail and other providers connect with an App Password over IMAP/SMTP. If the connection stops working: 1) Outlook / Microsoft 365 — OAuth tokens expire periodically and need to be refreshed; if automatic refresh fails, go to Mailboxes, click the affected mailbox, and Sign in with Microsoft again. Tokens may be revoked if your Microsoft admin changed security policies or you changed your password. 2) Gmail and other App Password providers — the App Password may have been revoked (often after a password change, or if it hasn't been used in 6 months). Generate a fresh one (for Gmail, at myaccount.google.com/apppasswords with 2-step verification on), then click Update credentials and paste it in. 3) Check your email provider's third-party/app-access settings to make sure access is still allowed. After reconnecting, warmup and campaigns resume automatically.
If your WarmySender campaign analytics show fewer accepted connections than what you see on LinkedIn, this is normal behavior. There are several reasons for the discrepancy:
Tracking window — WarmySender only tracks connection acceptances that happen while the campaign is active and monitoring. If a prospect accepts your invite after the campaign completes or after the 'Wait Accept' timeout expires, that acceptance is not counted in campaign analytics.
Manual acceptances — If you sent connection requests outside of WarmySender (directly on LinkedIn), those are not tracked in campaign analytics.
Wait Accept timeout — Each 'Wait Accept' step has a maximum wait time (default: 14 days). If a prospect accepts after this timeout, the campaign has already moved them to the timeout branch and the acceptance is not retroactively counted.
Sync timing — LinkedIn connection acceptance data is synced periodically. There may be a short delay between when someone accepts and when it appears in your analytics.
Account-level vs. campaign-level — Your LinkedIn account may show total connections from all sources (manual, other campaigns, organic). WarmySender analytics only show connections from that specific campaign.
If your campaign appears paused or is not sending emails even though it is within the active sending window, check these common causes:
Subscription status — If your subscription expired, was cancelled, or payment failed, all campaigns are auto-paused. Check Billing page for your subscription status. Campaigns auto-resume when you re-subscribe.
Campaign status — Make sure the campaign status is 'Running' (not 'Draft', 'Paused', 'Cooldown', or 'Completed'). Check the Campaigns page for the status badge.
No available mailboxes — All assigned mailboxes may be disconnected, in error state, or have hit their daily limits. Check Mailboxes page for connection status. At least one mailbox must be active and connected.
Daily limit reached — Your plan's daily sending limit or per-mailbox daily limit may be exhausted. Check your Billing page for usage. Limits reset at midnight.
Bounce rate exceeded — If your campaign's bounce rate exceeded 5% (default threshold) with at least 50 sends, it enters 'Cooldown' mode automatically. Check campaign analytics for bounce rate.
Sending window mismatch — Verify the campaign's sending window (start/end hours) and timezone match when you expect sends. A campaign set to 9 AM-5 PM Eastern won't send during those hours Pacific.
Schedule days — Check that today is an active sending day. If the campaign is set to Mon-Fri only, it won't send on weekends.
No eligible prospects — All enrolled prospects may have already been contacted, replied, bounced, or unsubscribed. Check the campaign's prospect enrollment status.
Campaign end date passed — If you set an end date and it has passed, the campaign stops automatically.
Rate limiting backoff — After hitting a rate limit, the system backs off before retrying. This can cause temporary pauses of 1-60 minutes.
How to Diagnose:
Check campaign detail page for the 'Paused Reason' field (if paused).
Check campaign analytics for recent send activity.
Check your mailbox connection status in the Mailboxes page.
Check Billing for subscription and usage status.
If none of these apply and your campaign is still not sending, contact support at [email protected] with your campaign name and account email.
LinkedIn connection request steps in campaigns allow blank invite notes — it is not required to include a personalized message. If you are unable to save a step, the issue is likely one of the following:
Character limit exceeded — Invite notes are limited to 300 characters. If your message exceeds this limit, the save will fail. Check the character counter in the step editor.
Step type mismatch — Make sure the step type is set to 'Send Invite' (not 'Send Message' or 'Send InMail'). Message and InMail steps may have different validation rules.
Template selection issue — If you selected a template but then cleared the text, try deselecting the template entirely (set template to 'None') before saving.
Browser cache — Try refreshing the page (Ctrl+F5 / Cmd+Shift+R) and re-entering the step configuration.
Network error — Check your internet connection. The save may have failed due to a network timeout rather than a validation error.
Note on Blank Invites:
Blank invites are allowed but not recommended — the editor shows a warning: 'Personalized notes increase acceptance rates by 40%+'
This is a warning only, not a blocking error.
If you intentionally want to send blank connection requests, simply leave the invite note field empty and save the step.
Some users prefer blank invites because LinkedIn's own connection suggestions do not include notes, making blank requests appear more organic.
The 'p=none' setting is monitor-only (recommended for start).
Common mistake: Missing the underscore in _dmarc.
5) Verification in WarmySender:
Go to Analytics > Mailboxes to see SPF/DKIM/DMARC status per domain.
Green checkmark = configured correctly.
Red X = missing or misconfigured — hover for details.
6) Still failing? • Flush DNS cache: nslookup -type=txt yourdomain.com 8.8.8.8 • Check your DNS provider did not add extra quotes around TXT values. • Verify you are editing the correct domain (not a subdomain). • Contact your DNS provider support if records appear correct but still fail verification.
If your warmup volume seems stuck or is ramping up too slowly:
Normal behavior — New domains start at 1-3 emails/day with Conservative ramp. This is intentional to protect your domain. The system increases volume gradually over 2-4 weeks.
2) Check your ramp speed — Go to Warmup, click your mailbox, and check the ramp speed setting: • Conservative: 0.08 growth rate (slowest, safest for new domains) • Normal: 0.12 growth rate • Aggressive: 0.20 growth rate (only for established domains) If you are on Conservative and your domain has some history, consider switching to Normal.
Check your daily volume cap — Your configured max daily warmup emails may be limiting volume. The system ramps toward this target but won't exceed it.
Recovery mode — If your mailbox auto-switched to Recovery mode due to high bounce or spam rates, volume is intentionally reduced. Check your warmup strategy in mailbox settings. Let Recovery complete before expecting higher volume.
Shared quota — If you are running campaigns, warmup and campaigns share the daily sending limit. Campaign sends reduce available warmup capacity.
Peer availability — During off-peak hours or with a small warmup pool, fewer peers may be available. This is temporary and self-correcting.
Connection issues — Verify your mailbox shows 'Connected' status. A disconnected mailbox cannot send or receive warmup emails.
Plan limits — Check that your subscription is active. Free or expired plans may have reduced warmup capacity.
If volume has been stuck at the same level for more than 7 days with no obvious cause, disconnect and reconnect your mailbox, then re-enable warmup.
If recipients are marking your campaign emails as spam, take immediate action:
Impact — Spam complaints are the most damaging signal to your sender reputation. Even 1-2 complaints per 1,000 emails can significantly lower your domain reputation with Gmail and Outlook.
Automatic protection — WarmySender tracks spam complaints. If complaints exceed your campaign's threshold (default: 3), the campaign enters Cooldown mode and stops sending.
3) Immediate steps:
Pause the campaign manually if it has not auto-paused.
Review your email content — is it clearly irrelevant or overly aggressive?
Check your prospect list quality — are you sending to the right audience?
Verify your unsubscribe link is visible and working.
4) Root causes and fixes:
Wrong audience — Sending B2B emails to B2C contacts, or irrelevant industry targeting. Fix: Clean your list and improve targeting.
Aggressive content — Hard-sell language, excessive frequency, or misleading subject lines. Fix: Soften your approach and add more value.
No relationship — Cold emailing people who have zero context about you. Fix: Add a warm touchpoint first (LinkedIn view/connect, referral mention).
Missing unsubscribe — Although WarmySender adds unsubscribe links automatically, check that your email template does not accidentally hide or override them.
Old data — Emailing contacts from outdated lists (people who changed jobs). Fix: Re-verify lists and remove stale contacts.
5) Recovery:
Let the campaign Cooldown complete (24+ hours).
Clean your prospect list — remove contacts in industries or roles with high complaint rates.
Reduce daily volume to 10-15 emails/day.
Run warmup in Recovery mode for 2-3 weeks.
Monitor Health Score — resume campaigns only when it recovers above 70.
First, the thing most people expect and won't find: WarmySender has no passwords. There is nothing to forget, nothing to reset, and no 'Forgot Password' link — because there is no password on your account to begin with.
How signing in actually works 1) Enter your email address on the sign-in screen. 2) We email you a 6-digit code. 3) Type the code in and you're in. That's the whole flow, every time. If a page or an old article ever tells you to reset a password, it's out of date — ignore it.
The code hasn't arrived • Check your spam or junk folder — it's the single most common cause. Marking the message as 'not spam' helps future codes land properly. • Make sure you used the address you actually signed up with. If you typed a different address, we may have sent the code somewhere you're not looking (see 'My account looks empty' below). • Give it a minute. Codes usually arrive within seconds, but a busy mail provider can add a short delay. • Still nothing? Request a new code and try again — you can request as many as you need.
The code says it's expired or invalid Codes are short-lived on purpose, so an old email won't let anyone in later. If yours has expired, request a new one and use the most recent email — an older code in your inbox will not work. Type the digits rather than pasting, in case a stray space came along with the copy.
My account looks empty, or I'm being asked to choose a plan I already pay for This usually means you're signed in with a different email address than the one you subscribed with — not that anything is lost. People sign up with a work address and later sign in with a personal one, or with a slightly different spelling, or with an address that forwards into the same inbox. Everything you set up is safe under the other address. To check: compare the email address shown in Settings against the address on your billing receipt or card statement. If they differ, use the 'Try another email address' option on the sign-in screen — enter the other address and we'll send a sign-in code straight to it, so you can get into the right account without starting over. Do not delete the empty-looking account; it won't stop any billing and it can't be undone. See /documentation/cancel-or-delete-your-account.
Session expired / you were signed out Sessions last 30 days. After that you sign in again with a fresh code. That's normal security behaviour, not a fault.
Browser issues • Clear cookies and cache for warmysender.com. • Try a private / incognito window. • Turn off extensions that block cookies (ad blockers, privacy tools) for warmysender.com. • Make sure cookies are enabled for warmysender.com — sign-in can't be remembered without them.
Multiple workspaces If you belong to more than one workspace, you're in one at a time. Use the workspace switcher in the sidebar to move between them.
Access limited after a subscription ends If your subscription expired or was cancelled, you can still sign in — access is just limited to the Billing page so you can reactivate.
Too many attempts After a lot of rapid sign-in attempts you may be asked to wait a few minutes before trying again. Give it about 15 minutes and try once more.
Invited to a workspace but can't get in • Make sure you opened the invitation email and clicked the link in it. • Sign in with the exact email address the invitation was sent to — an invitation is tied to that address. • Ask the workspace owner to check your invitation status in Settings > Team.
Still stuck? Email [email protected] from the address you're trying to sign in with, and tell us what you see on screen. We answer within 24 hours on business days.
If your webhook endpoint is not receiving events from WarmySender:
Check webhook status — Go to Settings > Webhooks and verify your webhook is active (not paused). Check the delivery history for any failed deliveries.
2) Verify endpoint URL — Make sure your webhook URL is:
Publicly accessible (not localhost or behind a firewall)
Using HTTPS (HTTP may be blocked)
Returning a 200 status code within 5 seconds
Test your endpoint — Click 'Test' in webhook settings to send a test event. If the test fails, your endpoint has an issue.
Event selection — Verify you have subscribed to the correct events. Available events: reply.received, email.bounced, email.unsubscribed, email.opened, email.clicked, prospect.suppressed, limit.hit. For example, reply.received only fires when a reply is detected in a campaign.
5) Check delivery history — Each webhook shows recent delivery attempts with status codes. Common errors:
404 — Your endpoint URL is wrong or the route does not exist.
500 — Your endpoint is throwing an error. Check your server logs.
Timeout — Your endpoint took more than 5 seconds to respond. Return 200 immediately and process asynchronously.
Connection refused — Your server is down or not accepting connections.
Retry policy — Failed deliveries are retried up to 10 times with exponential backoff (1min to 72hrs). Events are not lost on first failure.
Signature verification — Verify using the X-Warmy-Signature header with your webhook secret (HMAC-SHA256). Format: t=timestamp,v1=signature.
Firewall/network — Ensure your server's firewall allows incoming POST requests from WarmySender's servers.
For testing without a live endpoint, use services like webhook.site or requestbin.com to create a temporary endpoint and verify events are being sent.
If you encounter errors when searching LinkedIn or notice some filters aren't working:
Industry filter not available? The industry filter requires a Sales Navigator or Recruiter LinkedIn account. Basic and Premium LinkedIn accounts can search by keywords, location, job title, and company, but cannot filter by industry. If you need industry filtering, consider upgrading to LinkedIn Sales Navigator.
Getting 'Invalid search request' errors? • Make sure you've selected at least one filter (keywords, location, etc.) • For basic LinkedIn accounts, try adding keywords along with your location filter for better results • If the error persists, try reconnecting your LinkedIn account
Getting 'Account connection expired' errors? Your LinkedIn session may have expired. Go to LinkedIn Accounts and reconnect your account.
Search returning unexpected results? • Basic accounts have more limited search capabilities than Sales Navigator • Job title and company fields are combined into the keyword search on basic accounts • For precise filtering, consider using a Sales Navigator account
LinkedIn enrichment is intentionally rate-limited to protect your LinkedIn account from restrictions or bans. Here is why it takes time and what you can do:
Why Enrichment Is Slow: Each enrichment request fetches a full LinkedIn profile through your connected account — the same way you would manually view a profile on LinkedIn. LinkedIn monitors how many profiles you view per day and will restrict accounts that view too many. To prevent this, WarmySender enforces a daily cap based on your account strategy:
New Account (week 1): ~10 profiles/day
Established (week 1): ~30 profiles/day
Veteran (week 1): ~50 profiles/day
Recovery: ~5 profiles/day
For a new account with 1,000 profiles, the math is: 1,000 / 10 = ~100 days at week 1 rates. However, the cap increases each week as your account ramps up — so actual time is shorter as your account matures.
Can I Speed It Up? The enrichment rate cannot be manually increased — it is governed by your account's safety strategy. However: 1) Your daily cap increases automatically each week. By week 4-6, you may be enriching 40-80 profiles/day. 2) If your account was incorrectly classified as 'new' but is actually older, check LinkedIn > Accounts and verify your account age setting. 3) Veteran accounts (1+ year) get the fastest enrichment rates.
Do I Need to Wait? No — you can start a LinkedIn campaign immediately without waiting for enrichment. Enrichment adds extra personalization data but is not required. See the 'LinkedIn Campaigns' guide for details.
When the Daily Cap Resets: The daily cap resets at midnight UTC. Enrichment pauses when the cap is reached and resumes automatically the next day.
Tip: For large audiences (500+ profiles), consider starting your campaign immediately and letting enrichment run in parallel. Personalization data will become available as profiles are enriched.
If your LinkedIn enrichment job shows 'Failed' status or stopped processing, here are the common causes and solutions:
1) Account Disconnected During Enrichment: The most common cause. If your LinkedIn account loses connection while enrichment is running, the job fails with 'Account disconnected during enrichment'. Solution: Go to LinkedIn > Accounts, reconnect your account, then go to LinkedIn > Audiences, select your audience, and click 'Restart Enrichment'.
2) Circuit Breaker Triggered: If 10 or more enrichment errors occur in a single day, the circuit breaker stops enrichment to protect your account. This can happen if LinkedIn is temporarily rate-limiting your profile views. Solution: Wait 24 hours for the circuit breaker to reset, then restart enrichment from the Audiences page.
3) Audience Was Deleted: If you deleted and recreated an audience while enrichment was running on the old one, the job fails with 'Audience was deleted'. This is expected — simply start enrichment on the new audience.
4) Daily Cap Reached (Not a Failure): If enrichment shows 'Paused' (not 'Failed'), it has reached the daily cap and will resume automatically at midnight UTC. This is normal behavior — no action needed.
5) Multiple Failed Connection Attempts: If your LinkedIn account keeps disconnecting, there may be an issue with your LinkedIn session or proxy. Try: a) Reconnect with fresh credentials, b) Check your proxy settings in LinkedIn > Accounts, c) Verify your LinkedIn account is not restricted by LinkedIn itself.
After Fixing the Issue:
Reconnect your LinkedIn account if disconnected
Go to LinkedIn > Audiences and select your audience
Click 'Start Enrichment' or 'Retry' to restart the process
Previously enriched profiles are cached — the system picks up where it left off, not from scratch
A common question is why WarmySender uses your own LinkedIn account for enrichment instead of a separate 'WarmySender' account. Here is the technical explanation:
LinkedIn Has No Public Profile API: Unlike some social platforms, LinkedIn does not offer a public API for viewing profile data. Every profile view requires an authenticated LinkedIn session — meaning a real, logged-in LinkedIn account must be used.
Why Not a Shared System Account? • LinkedIn actively detects accounts that view hundreds or thousands of profiles per day from a single source. A shared 'system' account would be banned within hours. • A banned system account would instantly affect ALL users — not just one. • LinkedIn monitors IP addresses, user agents, and viewing patterns. A single account viewing profiles across many different industries and geographies is a clear bot signal. • Your own account sees network-specific data (1st/2nd/3rd degree connection status, mutual connections) that a third-party account cannot see.
This Is Industry Standard: All LinkedIn automation tools (Lemlist, Expandi, Dripify, LinkedHelper, PhantomBuster, etc.) work the same way — they use your own LinkedIn account to fetch profile data. There is no technical alternative that does not risk account bans.
How We Protect Your Account:
Conservative daily caps (10-100 profiles/day depending on account age)
Random delays between profile views (2-5 seconds) to mimic human behavior
Dedicated proxy per account so your LinkedIn traffic comes from a consistent IP
Circuit breaker stops all activity if errors are detected
Rate limits shared with campaign actions to prevent exceeding safe thresholds
Bottom Line: Using your own account for enrichment is the only safe and sustainable approach. The alternative — a shared scraper account — would get banned quickly and provide inferior data (no connection degree information). WarmySender's conservative rate limits ensure your account stays safe while enrichment runs in the background.
Yes — you can start a LinkedIn campaign immediately without waiting for enrichment to complete.
What Campaigns Need: LinkedIn campaigns only require LinkedIn profile URLs to function. When you create an audience (from search, CSV import, or manual entry), each profile has a LinkedIn URL. This is all the system needs to send connection requests, messages, and InMails.
What Enrichment Adds: Enrichment fetches additional profile details — first name, last name, headline, company, location, and job title. These are used for personalization merge tags in your campaign messages (e.g., {{firstName}}, {{company}}, {{headline}}).
What Happens Without Enrichment:
Connection requests are sent normally — LinkedIn uses the profile URL, not enriched data.
Messages and InMails are sent normally — the prospect's LinkedIn identity is resolved from their URL.
Merge tags for unenriched profiles will be empty unless you set fallback values.
Use Liquid syntax fallbacks: {{firstName | default: 'there'}} renders as 'there' if the name is not yet enriched.
Recommended Workflow for Large Audiences:
Import your audience (e.g., 1,000 profiles from a Sales Navigator search)
Start enrichment in the background (LinkedIn > Audiences > Start Enrichment)
Create your campaign immediately — do not wait for enrichment
Launch the campaign — it will process prospects using available data
As enrichment completes for each profile, the additional data becomes available for subsequent campaign steps
This parallel approach means you are running your campaign and enriching at the same time — no wasted days waiting.
When Enrichment Does Matter: If your campaign strategy heavily relies on personalization (e.g., mentioning the prospect's company or headline in your invite note), you may want to wait for at least partial enrichment. But even then, you can start the campaign and the first prospects processed will be those with available data.
If your Dashboard Health Score is dropping even though your per-mailbox warmup scores are high (e.g., 100), the issue is likely in your campaign performance or LinkedIn account status — not warmup.
The Dashboard Health Score is a composite metric that combines warmup health (30-40% weight), email campaign performance (40-50% weight), LinkedIn health (20% weight), and campaign status (10% weight).
Most common causes:
Low campaign open rates — If you recently started email campaigns on new or under-warmed domains, open rates may be below 20%. The email sub-score penalizes open rates below 20% heavily. Solution: Warm up mailboxes for at least 2-3 weeks before launching campaigns. Write better subject lines and start with small volumes.
Zero reply rate — New campaigns with no replies yet get a low reply score. This is normal for the first few days. As replies come in, the score will improve.
LinkedIn account needs verification — If your LinkedIn account status changed to 'needs_verification' or is restricted, the LinkedIn sub-score drops significantly. Check LinkedIn > Accounts and reconnect if needed.
Missing DNS records — If SPF or DKIM is not configured on some mailbox domains, the warmup sub-score is penalized. Check Analytics > Mailboxes for DNS status.
What to do:
Check which sub-score is low: look at the dashboard insights for specific recommendations.
If campaigns are new, give them time — the score will improve as engagement data accumulates.
If LinkedIn is the issue, reconnect your LinkedIn account.
Ensure all domains have proper SPF, DKIM, and DMARC configured.
See the 'Understanding the Dashboard Health Score' guide for full details on how the composite score works.
If your Analytics page shows no data or appears empty, check the following:
Account age — If your account is very new (less than 3-7 days old), there may not be enough data to display meaningful analytics. Warmup analytics require at least a few days of warmup activity. Campaign analytics require sent emails with tracked events (opens, clicks, replies).
Date range — The Analytics page defaults to a 30-day date range. If your account is newer than 30 days, all your data should be within this range. Try switching between 7d, 14d, and 30d date ranges using the dropdown at the top of the page.
Active tab — The Analytics page has multiple tabs (Overview, Campaigns, Mailboxes, Templates, Segments, Warmup, Deliverability, LinkedIn). Each tab loads data independently. Make sure you are on the correct tab for the data you expect to see.
No campaigns running — The Overview tab primarily shows campaign email metrics (sent, opened, replied, bounced). If you have not sent any campaign emails yet, the overview will show zeros. Warmup data appears on the Warmup tab.
Warmup tab specifically — The Warmup analytics tab shows data from the warmup_daily_stats table. If warmup has been running for less than 2-3 days, charts may appear sparse. This is normal — data populates as warmup activity accumulates.
Warmup stats update frequency — Warmup health scores and inbox/spam rates are recalculated approximately every 6 hours by a background scheduler. If you just enabled warmup, wait for at least one stats update cycle.
Browser cache — Try a hard refresh (Ctrl+F5 or Cmd+Shift+R) to force reload the page data.
Subscription required — Some analytics features require an active paid subscription. Check your Billing page for subscription status.
If analytics still show no data after 7+ days of active warmup and campaign sending, contact support at [email protected].
If you see prospects marked as 'Failed' with the error 'Failed: stuck in processing loop after 3+ recovery cycles', this means the system tried to send an email to the prospect three times but could not complete the send each time.
Why this happens:
Your mailbox hit its daily sending limit — If your campaign has more prospects scheduled to send than your mailbox can handle in a day, some send jobs get stuck waiting for capacity. After 3 retries without successful delivery, the prospect is marked as failed.
Only one mailbox assigned — With a single mailbox and a low daily limit (e.g., 30/day), the system cannot process high volumes. Jobs compete for limited send slots.
Sending window too narrow — If your sending window is short (e.g., 2 hours) and many sends are scheduled, some may not get processed in time.
How to fix:
Add more mailboxes to your campaign — Go to Campaign Settings and assign 3-5 mailboxes. Use mailbox rotation (round-robin) to distribute load.
Reduce daily campaign volume — Lower your per-campaign daily send limit to match your available mailbox capacity.
Widen your sending window — A wider sending window (e.g., 8 AM to 6 PM instead of 9-12) gives more time to process all sends.
Check mailbox health — Ensure all assigned mailboxes are connected and not in error state.
Recovering failed prospects: Failed prospects can be re-enrolled in a new campaign. Export or note the failed prospect emails from your campaign detail page, fix the capacity issue (add mailboxes, reduce volume), and create a new campaign targeting those prospects.
Prevention: As a rule of thumb, your total daily mailbox capacity (number of mailboxes × daily limit per mailbox) should be at least 2x your campaign's daily send target. This ensures there is always available capacity even during peak scheduling.
When a LinkedIn or email step fails for a specific prospect, the campaign Prospects tab shows a per-prospect error pill explaining why. Most errors are temporary and resolve on the next scheduler tick — but a small set are permanent and need user action. Here is the full list:
Invite failed: profile not found — LinkedIn could not find the profile. Common causes: the profile was deleted by its owner (most common), the account was banned by LinkedIn, the profile's identifier changed after a rebrand, or a rare lag in our lookup cache.
What to do: a single 'not found' can be transient and the platform will retry. After three in a row, the campaign detail page shows an 'Invalid prospects' banner with a one-click Exclude button. Excluding a prospect stops them, cancels any pending sends, and frees the daily-invite slot. Excluding involves no LinkedIn calls at all, so it is safe even while the account is in cooldown.
Account in cooldown until <timestamp> — LinkedIn told us your account hit its invite limit. The published guidance is to space requests at random intervals and respect LinkedIn's 80-100 invitations/day band (5/month for free accounts). WarmySender sets a 4-8h account-level cooldown so other prospects on the same account also wait — burning more sends during a throttle deepens the rejection.
What to do: WAIT. The cooldown auto-clears at the timestamp shown in the error. Do not pause and resume the campaign — that does not shorten the cooldown and adds noise. We always keep the longer of the existing and the new cooldown, so repeated throttles never shorten the deadline; only longer ones extend it. The send that hit the cooldown is retired, but the prospect is rescheduled to just after the cooldown ends and a fresh send is queued automatically on the next tick.
Daily LinkedIn limit reached / Weekly invite limit — You sent up to your configured daily/weekly cap, which is anchored to LinkedIn's 80-100/day band and your ramp week (1-4).
What to do: WAIT. The daily cap resets at midnight UTC; the weekly cap resets Monday 00:00 UTC. Scheduler resumes automatically.
Outside sending window — The action would have fired outside your campaign's sending window (e.g. weekend, late evening).
What to do: WAIT. The job re-fires on the next valid window slot. If you want sends 24/7, edit the campaign and widen the window — but for LinkedIn, off-hour activity raises ban risk.
LinkedIn account disconnected (campaign pause) — your LinkedIn session expired or you logged out elsewhere.
What to do: RECONNECT. Settings → LinkedIn → Reconnect. The campaign auto-resumes within 5 minutes (one scheduler tick) once the connection is healthy.
Permanently failed after 5 stuck — A processing safety valve fired. Usually caused by 5 consecutive transient blockers (disconnected account, daily-cap hit, sending-window starvation).
What to do: RECOVER. The campaign detail page shows a 'Stuck prospects' orange banner with a Recover button — click it once the underlying issue is resolved (account reconnected, capacity added, etc.).
For the full 'profile not found' troubleshooting and cooldown deep-dive, see the 'Why prospects might fail and how to fix' section at /documentation#prospect-failures.
If the Endorse Skill campaign step is being skipped for some prospects, it means those prospects have no endorsable skills on their LinkedIn profile. This can happen when:
The prospect has not listed any skills on their profile
The prospect's skills don't have endorsement IDs (rare technical issue)
The prospect's profile is restricted or not fully visible to your account
When this happens, the step advances to the next one automatically — it does not fail the enrollment. This is by design to ensure your campaigns continue smoothly.
If you specified a preferred skill name in the step configuration and it wasn't found, the system endorses the first available skill instead.
To verify: Check the enrollment's event log for a 'skill_endorsed' event. If missing, the step was skipped due to no available skills.
LinkedIn only allows message deletion within 60 minutes of sending. After this window, the delete button is hidden and the server will reject deletion attempts.
This is a LinkedIn platform limitation, not a WarmySender restriction. The 60-minute window is enforced both in the UI (the delete button only appears for messages sent within the last hour) and on the server (the API returns a 'DELETE_WINDOW_EXPIRED' error if you try to bypass the UI).
If you need to address a sent message after the 60-minute window:
Send a follow-up correction message
If the message was to a campaign prospect, you can adjust the campaign steps for future enrollments
Tip: Review your message templates carefully before launching campaigns to minimize the need for message deletion.
If your main subscription is canceled or becomes inactive, your LinkedIn add-on is also affected:
All connected LinkedIn accounts will be disconnected
All active LinkedIn campaigns will be paused
Your LinkedIn seats will become inactive
The LinkedIn add-on cannot operate independently — it requires an active paid subscription. If you re-subscribe, you can reconnect your LinkedIn accounts and resume campaigns.
Note: Canceling only the LinkedIn add-on does NOT affect your email plan. Your email campaigns, warmup, and other features will continue working.
Your first workspace is created automatically when you sign up. To create additional workspaces (available on Enterprise and Ultimate plans):
Click the workspace switcher in the sidebar
Click 'Create Workspace' at the bottom of the dropdown
Enter a name for your new workspace and click Create
Workspace limits by plan:
Pro: 1 workspace
Enterprise: Up to 5 workspaces
Ultimate: Up to 10 workspaces
Key details:
No extra charge — additional workspaces are included with your plan
Your monthly email quota is shared across all workspaces (e.g., 10,000/month on Pro total)
LinkedIn seats are per-workspace — each workspace using LinkedIn needs its own seats ($15/seat/month; seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price)
Each new workspace starts empty — connect mailboxes, import prospects, and create campaigns separately
Pro plan users: Upgrade to Enterprise ($69.99/month) from the Billing page to unlock multiple workspaces.
Your subscription plan covers your entire account, including all workspaces you own:
Subscription (Pro/Enterprise/Ultimate) is account-level — one plan covers all your workspaces
Monthly email quota is shared across workspaces (e.g., Pro's 10,000 emails/month is the total for all workspaces combined)
LinkedIn seats are billed per workspace — if 2 of your 3 workspaces use LinkedIn, each needs its own seat subscription at $15/seat/month (seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price)
Team member limits apply per workspace (Pro: 2 members, Enterprise: 4 members, Ultimate: 15 members per workspace)
Connected mailbox limits by tier: Pro 50 / Enterprise 400 / Ultimate 800 (Free: 1, Lite: 3)
Workspace limits by plan:
Pro: 1 workspace
Enterprise: Up to 5 workspaces
Ultimate: Up to 10 workspaces
Example — Agency on Enterprise ($69.99/month) with 3 workspaces:
Total email budget: 100,000/month shared across all 3 workspaces
If you see an Open Rate or Click Rate above 100% anywhere in the platform, here is what is happening and how we handle it.
What Causes Inflated Rates Email security scanners such as Microsoft SafeLinks, Mimecast, Proofpoint, and Gmail's own link preview services automatically pre-fetch every link and tracking pixel in incoming email to check them for malware and phishing. They do this with non-human user-agents, often before the recipient has even seen the message. Each pre-fetch can register as an open or click in raw tracking data, which artificially inflates the counters.
In some environments, a single email can trigger 2-3 scanner opens and 3-5 scanner clicks before a human ever touches it — which is how raw open or click counts can exceed the number of emails sent.
How WarmySender Filters Scanners We filter these security scanners out at the tracking endpoints by matching known scanner user-agents, IP ranges, and request patterns. Filtered events are excluded from your displayed numbers so you get accurate metrics instead of raw counters.
100% Safety Cap As an additional safety guard, displayed Open Rate and Click Rate values are capped at 100%. You will never see '127%' shown in the UI — even if raw data were temporarily off, the display clamps to 100%.
If You Still See Inflated Numbers If a campaign shows a rate suspiciously close to or at 100% and you think something is off, the most common cause is recent re-enrollment of prospects. When you re-enroll prospects into a campaign, the original tracking links from previous enrollment cycles can still fire if a scanner pre-fetches them later. This can make it look like a single send is generating multiple events.
Recommendation: Trust Reply Rate We recommend treating Reply Rate as your primary engagement metric. Replies are not faked by scanners — they come from real humans who actually read your message. Open Rate and Click Rate are useful directional signals, but Reply Rate is the number that reflects real interest in your outreach.
When a prospect replies to one of your campaign emails with an Out of Office message, WarmySender handles it automatically so your sequence is not accidentally ended.
Automatic Detection in 5 Languages We auto-detect Out of Office replies in English, Dutch, German, French, and Spanish. The system scans incoming replies for common Out of Office phrasing and headers in each language and classifies them accordingly.
Out of Office Does NOT Terminate Enrollment An Out of Office reply is treated as 'the lead is on vacation, not rejecting you'. It does not stop the sequence. The campaign automatically resumes its sequence for that lead once they return and the normal scheduling kicks back in — so you do not lose the lead, and you do not accidentally burn the follow-up by treating a vacation bounce as a real reply.
If We Miss an Out of Office (Rare) Occasionally a reply uses very unusual phrasing that the detector misses (for example, an internal custom auto-reply in a language we do not yet support). If you spot one in your inbox and it was classified as a normal reply, you can fix it manually:
Open the Unified Inbox and click the reply in question
Change the sentiment to 'Out of Office'
Save
As soon as you mark the reply as Out of Office, the campaign immediately resumes its sequence for that lead.
What Happens Next Leads marked as Out of Office return to Pending status and pick up their next sequence step on the next scheduler tick. You do not need to re-enroll them or take any further action — the system will continue the sequence automatically on schedule.
Best Practice If you notice a specific phrasing the detector keeps missing, report it to support so we can improve coverage. Out of Office detection is continually refined based on real-world examples.
Connected mailbox limits by plan (account-wide, across all your workspaces):
Pro ($14.99/mo): 50 mailboxes
Enterprise ($69.99/mo): 400 mailboxes
Ultimate ($199/mo): 800 mailboxes
Free tier: 2 mailboxes
There is no per-mailbox fee on any paid plan — you can warm up every connected mailbox at no additional cost, up to your plan's cap. Email warmup runs on all connected mailboxes simultaneously. Your other constraint is your monthly email quota (e.g., 10,000/month on Pro), which is shared across all mailboxes and all sending activity (warmup + campaigns). Need more than 800 mailboxes? Contact [email protected] for a custom limit.
Team members refers to the number of people who can access your WarmySender workspace. Each member gets their own login account.
Pro plan: 2 members — this means you (the workspace owner) plus 1 invited team member
Enterprise plan: 4 members — you plus 3 invited team members
Team members are NOT mailboxes. Mailboxes (email accounts you connect for warmup/campaigns) are unlimited on all paid plans. Members are the people who log in to manage your campaigns.
IMPORTANT: Connecting a mailbox does NOT use a team member seat. You can connect email accounts (mailboxes) up to your plan's mailbox cap without inviting anyone. For example, if you have 6 domains with 3 email addresses each (18 mailboxes total), you can connect all 18 to a single workspace and manage them entirely on your own — no additional team members needed. The Pro plan at $14.99/month is all you need.
Each invited member can be assigned a role:
Admin — Full access except billing management
Member — Create campaigns, manage prospects, view analytics
Viewer — Read-only access to all data
To invite a team member: Go to Settings > Team tab > Click 'Invite' > Enter their email and select a role. Pending invitations count toward your member limit.
If you need more than your plan allows, upgrade to Enterprise ($69.99/mo) for 4 members, or contact support for custom needs.
Yes! You can connect mailboxes from as many domains as you want into a single workspace. There is no domain limit and no per-mailbox fee on any paid plan.
Example scenario:
You have 6 domains (e.g., acme.com, acmesales.com, acmeio.com, etc.)
Each domain has 3 email accounts (e.g., john@, sales@, info@ on each)
That is 18 mailboxes total
You can connect all 18 to ONE workspace on the Pro plan ($14.99/month) and manage them entirely by yourself
Key points:
Mailboxes are email accounts you connect — they are NOT the same as team members or seats
Connecting a mailbox does NOT require a team member seat
A single workspace owner can connect and manage many mailboxes alone — no need to invite anyone
Connected mailbox limits by tier: Pro 50 / Enterprise 400 / Ultimate 800
Team member seats (Pro: 2, Enterprise: 4, Ultimate: 15) are only for inviting other people who need their own login to help manage the workspace
All connected mailboxes share your plan's monthly email quota (Pro: 10,000/month, Enterprise: 100,000/month, Ultimate: 300,000/month)
Each mailbox can be independently assigned to campaigns and warmup
When to use multiple workspaces instead:
You are an agency managing separate clients who should not see each other's data
You want completely isolated campaigns, prospects, and analytics per business unit
Multiple workspaces are available on Enterprise (up to 5) and Ultimate (up to 10) plans
The LinkedIn add-on is a separate subscription billed at $15/seat/month (or $120/seat/year — 33% off — on annual billing), available on any paid plan. Seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price. New orders are $15/seat/month, or $120/seat/year (33% off).
Key details:
Each seat allows one connected LinkedIn account
Minimum 1 seat, maximum 10 seats per workspace
Billed monthly, separately from your main email plan
Can be bundled during initial checkout or added later from the Billing page
You keep access until the end of your current billing period
LinkedIn accounts are disconnected and campaigns paused only after the billing period ends
IMPORTANT: LinkedIn seats require an active paid email subscription. If your main subscription (Pro/Enterprise/Ultimate) is canceled or becomes inactive, your LinkedIn accounts will be disconnected and LinkedIn campaigns will be paused — even if your LinkedIn seat subscription is still active. The LinkedIn add-on cannot function without a base email plan.
Canceling only the LinkedIn add-on does NOT affect your email plan or email campaigns.
You can apply a promo code when subscribing or when changing your plan.
During initial checkout:
When you click 'Subscribe' on a plan, the Stripe checkout page has a field for promo/coupon codes
Enter your code before completing payment to see the discounted price
When changing plans (existing subscribers):
Go to the Billing page
Click 'Change Plan'
Select your new plan
Enter your promo code in the promo code field
The discounted price and any proration will be shown before you confirm
Note: Promo codes may have usage limits, expiry dates, or restrictions on which plans they apply to. If a code is not working, it may have expired or reached its usage limit. Contact support at [email protected] for assistance.
Yes! WarmySender offers both monthly and annual billing. Annual plans save you 55% compared to monthly pricing as part of a limited-time evergreen offer.
Annual Pricing (billed yearly, save 55% — limited time):
Pro: $6.74/month ($80.88/year) — save 55%
Enterprise: $31.49/month ($377.88/year) — save 55%
Ultimate: $89.55/month ($1,074.60/year) — save 55%
Monthly Pricing:
Pro: $14.99/month
Enterprise: $69.99/month
Ultimate: $199/month
How the limited-time 55% annual offer works:
The 55% discount is evergreen but framed with a real end-of-month deadline that resets monthly. The date you see counting down is the actual end of this calendar month UTC, but the discount itself does not actually disappear when the date hits — the urgency framing rolls forward.
Customers already on a previous annual rate keep their original price — they are grandfathered at the rate they signed up for and renew at that same rate until they cancel or switch tiers.
Promo codes can stack on top of the 55% (a 10% off code at checkout makes the total ~59.5% off list price).
LinkedIn seats are billed separately — $15/seat/month, or $120/seat/year (33% off) on annual billing (seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price).
You can switch between monthly and annual billing from the Billing page. All prices are in USD. Cancel anytime — you keep access until the end of your paid period.
Go to the Mailboxes page, open the row's dropdown menu, and click 'Edit Daily Limit' (also available from the mailbox's View Details page). Enter the new value and save — the change is live on the next scheduler tick. You do NOT need to disconnect or reconnect the mailbox, and no campaigns are disrupted.
Remember the MIN-of-three rule: sending is capped by the MINIMUM of the mailbox's daily limit, the campaign's dailySendLimit, and the campaign-mailbox maxSendsPerMailboxPerDay — whichever cap is hit first stops sends. Warmup volume is tracked separately and is not affected by this setting.
This was a real bug — fixed Apr 30, 2026. Earlier, a few code paths could pause a LinkedIn campaign without also recording when it was paused and why. Campaigns paused that way were invisible to the auto-resume sweeper and stayed paused forever, even after the underlying issue (account disconnect, high failure rate, and so on) had cleared.
The fix routes every pause through a single path that records the status, the time, and the reason together — plus a safety rule in our database that rejects any future pause that arrives without a reason.
What you should see now:
Open the campaign detail page and look at the pause reason — it now always tells you why the pause happened (for example: LinkedIn account disconnected, high failure rate, subscription lapsed, or paused manually).
If your campaign predates the fix and the reason is still blank, click Resume once. The system re-evaluates the campaign, fills in a reason if there is a real cause, or moves it back to running if there isn't.
Your prospects, sequences, and analytics are completely untouched by the fix.
If Resume immediately re-pauses with a reason filled in, the underlying issue is real (for example, the account is genuinely disconnected) — fix that first, then Resume again.
Sales Navigator URLs (the form linkedin.com/sales/lead/ACoAAA...,NAME_SEARCH,XYZ) sometimes can't be resolved to a public LinkedIn member ID. This happens for restricted profiles, recently-deleted leads, and a known upstream issue with certain ,NAME_SEARCH, query suffixes.
Before Apr 30, 2026, when a link couldn't be resolved, our campaign engine treated the prospect as 'cannot be invited, mark complete' — quietly finishing them off with no invite ever attempted. Since that fix, affected prospects show as 'link not resolved' instead, and the engine retries with widening gaps up to five times before giving up. They are never quietly discarded again.
To recover prospects affected by the old behavior:
Best path: re-import them with regular linkedin.com/in/<handle> URLs. The public profile form resolves far more reliably.
If you have many affected prospects, contact support — we can move the eligible ones back to 'link not resolved' so they re-enter the queue on the next campaign tick.
Your campaign settings and other prospects are untouched. One customer losing 264 of 412 prospects on Apr 30, 2026 is what surfaced the problem and drove the fix.
No, the counter is correct. WarmySender ships two LinkedIn campaign engines that both increment invites_sent_week on your account: the legacy standalone engine (LinkedIn-only campaigns) and the unified multichannel engine (campaigns combining email and LinkedIn steps). Both engines hit the same atomic counter, but the journal rows land in different tables — linkedin_campaign_enrollments for standalone and prospect records for unified.
If the dashboard's per-campaign count looks lower than the counter, you're likely viewing a standalone campaign while the missing invites came from a unified multichannel campaign on the same account, or vice versa. The counter is the single source of truth for rate-limit gating, so it is never wrong.
As of Apr 30, 2026, the engineering audit query was fixed to join BOTH journal tables via the 2-hop campaigns.linkedin_account_id path; eight customers were briefly misdiagnosed as having a 'cap-leak' before the fix shipped — none of them actually did.
To see total invites across both engines for an account, the LinkedIn Accounts dashboard now shows invites_sent_week / weekly_limit directly from the counter (engine-agnostic). If the numbers still don't add up after a 5-minute refresh, contact support — we can run the canonical 2-hop diagnostic.
This was a real bug — fixed Apr 30, 2026. Reply detection depends on every inbound LinkedIn message being tied back to the campaign the prospect is enrolled in. Neither the real-time notification path nor the polling fallback was making that link before saving the message.
Net: every inbound LinkedIn message arrived with no campaign attached, so everything downstream of it — marking the prospect as replied, the auto-stop-on-reply check, the reply-rate analytics — quietly ignored it, and the dashboard showed 0 replies even when prospects had clearly responded. The worst part: campaigns kept sending follow-ups to prospects who had already replied.
The fix makes both paths look up the campaign before the message is saved, so every inbound message is now correctly attributed. We also back-filled the historical messages that had been saved without it.
What you should see now:
Reply stats refresh within an hour of the back-fill (the analytics roll-up runs hourly).
Campaigns auto-stop on first reply, so any follow-up that was queued but not yet sent is cancelled once the historical reply is recorded.
If you still see drift after that hour, contact support — we can re-run the back-fill for your workspace specifically.
Going forward, every inbound LinkedIn message is attributed the moment it is saved, so this cannot recur. An automated build check rejects any new code path that saves an inbound message without going through the shared lookup.
No — Apr 30 fix. Previously, whenever LinkedIn declined a profile lookup (the case shown to you as 'Profile inaccessible'), we marked the prospect as permanently failed with no further retry — even though that one response covers several genuinely different situations, some of which recover on a second attempt:
Sales Navigator links that don't resolve on one attempt but resolve cleanly on the next.
Link-format issues that our fallback lookup handles.
Transient upstream issues that clear within minutes.
A platform-wide audit found 21,868 prospects discarded this way.
The fix defers instead of discarding:
The prospect moves to 'pending resolution' rather than permanently failed.
We retry with widening gaps, up to five attempts, before marking anything as permanently failed.
The 21,868 affected prospects were swept into that same recovery flow, with their retries spread over 24 hours so the queue never pushes against LinkedIn's rate limits.
What you should do:
If you see this status on individual prospects, check that their LinkedIn URL is current. Regular linkedin.com/in/<handle> URLs resolve most reliably.
Click Retry on the prospect detail page if you want an immediate re-attempt; otherwise recovery is automatic.
If a prospect keeps landing back in 'pending resolution' after five retries, that's a genuinely restricted profile. It will be marked as failed at that point, and you can safely exclude or remove them.
No manual recovery is needed for the 21,868 affected prospects — that was handled for you.
This is a real bug — fixed Apr 30, 2026. Previously, if your campaign template referenced a custom variable like {{custom.Linkedinconnection}} and your imported CSV didn't have that column (typo, missing column, capital-letter mismatch), the campaign engine had two failure modes:
Older behaviour: render the message with a literal 'undefined' and send it anyway (rude, and it kills reply rates).
Later behaviour: mark the prospect as permanently failed, which couldn't be undone without us stepping in.
One customer hit this and lost 9 of 15 prospects before noticing. The fix is two-layer:
(1) Validate-at-launch — the campaign launch path now enumerates every {{custom.<name>}} reference in your template, intersects against the actual column set in your prospect data, and BLOCKS launch with an actionable error if any references aren't satisfiable. The error names the missing column AND lists every column that DOES exist in your prospect data, so you can immediately see whether you have a typo (capital L vs lowercase l, missing s, etc.) or a genuinely-missing column.
(2) Defer-at-send — if a template variable somehow still unresolves at send time (race: campaign launched against audience N, then audience N had a column dropped before the send fired), the prospect is now parked as 'waiting on a template fix' instead of being marked as permanently failed. The prospect re-enters the queue on the next campaign re-evaluation, so once you fix your template OR re-import the CSV with the corrected column, the affected prospects retry automatically — no manual un-burn needed.
How to fix this on existing prospects:
Option A — edit your template to remove the missing variable. Save the campaign. Click Resume. Affected prospects retry on the next campaign tick.
Option B — re-import the CSV with the column populated (or rename the column to match your template's spelling). Click Resume. Affected prospects retry.
Option C — if you used a typo (capital L on Linkedinconnection but your CSV has lowercase linkedinconnection), the simplest fix is to edit the template to use the lowercase name, save, and click Resume.
No LinkedIn actions were attempted for the affected prospects, so there is no cost against your limits for retrying.
If your dashboard is missing recent LinkedIn replies even though prospects are clearly replying on LinkedIn, the most likely cause is an upstream outage at our LinkedIn integration partner.
First, the important thing: every reply is still safely in your LinkedIn inbox — nothing is lost on LinkedIn's side. The gap is purely between our LinkedIn provider and WarmySender, NOT between you and your prospect.
How the signal flows: Prospect replies on LinkedIn → LinkedIn delivers to our LinkedIn provider → our LinkedIn provider notifies us in real time → WarmySender records the reply on your dashboard.
When those real-time notifications stall, the inbound message still reaches us through a 30-minute polling fallback, but the things the notification normally triggers — marking the prospect as replied, the auto-stop-on-reply check, the Slack / n8n / Zapier reply alert, and the dashboard reply counter — only happen when the notification itself arrives. So during the outage you may see follow-ups continue on threads where the prospect has already replied.
What is ours to fix and what is theirs:
Ours — recording the reply, dashboard counters, the Slack / n8n / Zapier alert, and auto-stop-on-reply. A health monitor checks every 15 minutes whether reply notifications have gone quiet and raises an internal alert the moment they have.
Theirs — the actual delivery of the notification from LinkedIn through to us. When that delivery stalls, we escalate it with them directly.
What WarmySender does during the outage:
The 15-minute health monitor raises a high-severity internal alert within one check of the outage starting.
The 30-minute polling fallback keeps pulling inbound messages so we retain a complete record of what arrived. This is cover, not a fix.
Once delivery is restored, we replay every message that arrived during the outage and re-run the steps that were missed. That retroactively marks your prospects as replied, applies auto-stop-on-reply, wakes any step that was waiting on a reply, and sends the missed Slack / n8n / Zapier alerts. The replay is safe to run more than once.
What you can do as a customer:
Reassurance: replies are not lost. Open the actual LinkedIn inbox to read them while waiting.
If you have time-sensitive threads, manually pause the affected campaigns until the dashboard catches up — this prevents follow-ups from going out on already-replied threads during the outage window.
Once recovery completes (typically within an hour of delivery being restored and the replay running), your dashboard reply counters will reflect reality and stop-on-reply will have been applied retroactively.
If you suspect this is happening to your workspace, contact support at [email protected] with a sample prospect URL and roughly when the reply came in; we can check the state of your accounts and confirm the recovery timeline.
No extra LinkedIn calls are made during detection or replay — account safety always wins. Our job during an outage like this is detection, covering the gap with the polling fallback, and replaying on recovery; restoring delivery itself sits with our integration partner, and we chase it with them.
If a prospect's LinkedIn invitation was accepted but they never received the configured follow-up message, you're hitting one of three scenarios. We have specific recovery flows for each one — no prospects are permanently lost.
Scenario 1 — the LinkedIn account was disconnected at the moment the follow-up was supposed to fire. The campaign engine cannot send a LinkedIn message through a disconnected account (account safety always wins), so it parks the prospect as 'waiting on the account to reconnect'. As soon as you reconnect the LinkedIn account, the platform's auto-resume sweep wakes the parked enrollments and the follow-up goes out on the next sending tick. No manual action is needed beyond reconnecting the account.
Scenario 2 — the follow-up step was a 'wait for acceptance' condition that already evaluated and routed the prospect down the false branch. This happens if the wait window expired before the acceptance webhook landed. The prospect is in the campaign's correct end state per how you configured the campaign — they aren't stranded, they were routed per the false branch you defined.
Scenario 3 — a silent skip caused by a timing race or an edit made to the campaign while it was running. This is the genuinely-stuck pattern: the prospect shows as accepted and the sequence shows as finished, but no message was ever sent and no error was recorded. Two recurring sweeps catch prospects in exactly this shape and re-queue the missing message. On Apr 30, 2026 we ran a one-off pass over 422 affected prospects — 28 were simply waiting on an account reconnect (scenario 1) and the remaining 389 were reviewed for a silent skip. Some had genuinely been re-routed by an edit made mid-run (scenario 2, nothing to do) and the rest were re-queued.
What to do:
Check the LinkedIn account status — if any account on the campaign shows 'Reconnect needed', click Reconnect, then wait 5-10 minutes for the auto-resume sweep.
Check the campaign's step configuration — did your wait window expire? Did you edit the campaign mid-flight and remove a step? The campaign card shows the current configuration.
If the prospect shows as accepted and the sequence shows as finished but no message was ever sent — and you HAD a follow-up configured — contact support at [email protected] with the prospect URL. We can re-queue them for you.
No extra LinkedIn calls are made during recovery, and every safety gate (sending window, per-account ramp, daily cap) still applies when the prospect wakes back up.
Replies imply acceptance — a prospect can't reply to your message unless they accepted the invite first. If your campaign shows replies but the accept counter is 0, you're hitting one of two issues.
Issue 1 — the fast-reply race (fixed Apr 27, 2026). When a prospect accepted and replied within moments of each other, we recorded the reply but skipped recording the acceptance, because the prospect had already moved past 'invited'. The accept counter reads the recorded acceptance, so it under-reported. The fix separates recording the acceptance from moving the prospect's status, so even a fast reply leaves the acceptance properly recorded.
Issue 2 — acceptances missing from the activity feed (fixed Apr 30, 2026). Some analytics surfaces — the 24-hour freshness banner on LinkedIn → Accounts and the per-account roll-up — read the older activity feed. After an earlier consolidation, multichannel campaigns were recording acceptances in one place but not mirroring them into that feed, so the banner said 'no accepts in 24h' even while accepts were flowing. The fix writes to both, and duplicate signals are collapsed automatically.
What the dashboard counters actually mean now:
Campaign-card 'Accepted' counter — reads the recorded acceptance on each prospect. This is the source of truth for acceptance rate.
Campaign-card 'Replied' counter — reads the recorded reply on each prospect. This is the source of truth for reply rate.
LinkedIn → Accounts 'last 24h activity' banner — reads the activity feed, which has been mirrored correctly since Apr 30.
If you still see the issue:
Give it an hour or two for the back-fill covering Apr 24 to Apr 30 to land in the activity feed.
Hard-refresh your dashboard — the counter is cached for 60 seconds.
If the accept rate still shows 0% and you have replies, contact support at [email protected].
No extra LinkedIn calls are involved in any of this — every fix works on signals we had already received.
This error means your campaign's message template has a Liquid template syntax error — most commonly a typo in a merge tag like {{company} (one closing brace instead of two) or {{first_name} (same shape).
Why this happens: Liquid is the merge-tag rendering engine that powers personalization. Every variable reference must be wrapped in EXACTLY two opening braces and two closing braces: {{firstName}}, {{company}}, {{custom.subject_line}}. If you accidentally type one closing brace instead of two, the template can't be rendered and the send fails.
Before Apr 30, 2026, this triggered an endless retry loop — we'd catch the error, mark the send as failed, the recovery sweep would recreate it, and the new attempt would hit the same typo. One customer's campaign had 28 message sends retrying continuously on the same '{{company}' typo until we shipped the fix.
After Apr 30, 2026:
We recognise the typo on the very first attempt.
The send is marked as failed for a template reason, so the dashboard banner can point you at the typo.
The prospect is parked as 'waiting on a template fix' so the recovery sweep does NOT recreate the send.
The error message is plain English: 'Template syntax invalid — please fix the template and resume'.
How to fix: 1) Open the affected campaign in the editor. 2) Find every merge-tag reference and verify each one has exactly TWO opening braces and TWO closing braces. Common typos: • {{firstName} → fix to {{firstName}} • {firstName}} → fix to {{firstName}} • { {firstName}} → fix to {{firstName}} (no space between the braces) • {{firstName | default: 'there'} → fix to {{firstName | default: 'there'}} 3) Click 'Save' on the campaign. 4) Click 'Resume' on the campaign card. Affected prospects retry on the next campaign tick. 5) The dashboard banner clears within 1-2 minutes.
No prospects are lost — they simply wait until you fix the template and resume. No LinkedIn action was attempted on the failed sends, because the typo is caught before we reach LinkedIn, so retrying costs you nothing against your limits.
If you're not sure where the typo is, click 'Preview' in the campaign editor — the preview will fail with the exact line number of the parse error.
If your LinkedIn campaign is showing zero activity, the dashboard count doesn't match your LinkedIn inbox, or prospects look stuck in a status that never changes, there are a handful of patterns we know about — most of them now have shipped fixes. This page walks through every common 'stuck' shape, what it looks like, why it happens, and what to do.
1) Auto-paused then auto-resumed near a sending window boundary (fixed Apr 30, 2026) Symptom: a large group of your prospects show as scheduled with a future send time, but nothing is actually queued for them, so nothing ever sends. Several customers hit this; one had 1,097 of 1,208 active InMail prospects stranded this way on the morning of Apr 30. Why: when a campaign auto-pauses (for example on a brief LinkedIn account disconnect) and then auto-resumes within minutes, the resume can land just outside your sending window. We correctly moved each prospect's next send to the next valid window, but the matching queued action was left half-finished, so the next sweep treated it as stuck and the prospect was effectively stranded. Nothing new was ever queued for them. Fix: rescheduling now updates the prospect and the queued action together in one step, and clears the stale in-progress markers. We also re-queued every prospect that had been stranded by the old behaviour. After the fix, your prospects pick back up at the next valid window and run normally. No action needed on your side. What 'auto-paused' means in general: it's a deliberate safety pattern — account safety always wins. We pause your campaign on a sustained failure rate, a disconnected LinkedIn account, or an upstream outage, to protect the account. Auto-resume re-checks the trigger every 5 minutes; once it clears, your campaign picks up where it left off without burning prospects.
2) Account-card daily counter under-reporting sends (fixed Apr 30) Symptom: LinkedIn → Accounts shows 'messages sent today: 1' but you can see 24 messages went out in the campaign activity log AND in your LinkedIn inbox. Why: the weekly counter that actually gates your rate limits was always correct, but the daily tile on the account card under-reported some sends. The campaign activity log and your LinkedIn inbox are always the source of truth. Fix: every send now updates the daily counter at the same moment it records the send, and a reconciler recomputes the daily figures every 30 minutes so any future drift heals itself. No action needed on your side — just hard-refresh your dashboard.
3) Reply detection looked broken (fixed Apr 30) Symptom: a prospect replied on LinkedIn but the dashboard still shows them as invited or connected — and Slack / n8n / Zapier reply notifications stopped firing. Why: replies were being recorded in one place but not mirrored to the place your analytics and Slack alerts read from. The inbound messages still arrived through the polling fallback, but the follow-on effects (reply counter, stop-on-reply, Slack ping) didn't fire. Fix: the mirror was added, and historical replies were back-filled. Reply stats refresh within about an hour. No action needed on your side.
4) A message step firing on prospects who hadn't accepted yet (fixed Apr 30) Symptom: prospects showing 'cannot message a non-connection' errors even though the step before was an 'if the invite was accepted' check. The condition step was in the campaign but wasn't holding the message step back. Why: when the condition hadn't been met yet, it was being read as 'move on' instead of 'keep waiting', so the campaign fell through to the message step before acceptance landed. Fix: an unmet condition now correctly means 'keep waiting' until it is satisfied or its wait window expires — exactly as you configured it; we never auto-shortcut. After the fix, the message step only fires once the condition is genuinely satisfied. No action needed on your side — your campaign resumes normally.
5) Phantom accepts (marked accepted without an invite ever being sent — fixed Apr 30) Symptom: a prospect shows as accepted even though no invite was ever sent from that campaign. One customer's campaign had 150 prospects in this state. Why: when the same LinkedIn member is enrolled in two or more of your campaigns, an acceptance signal was being applied to all of them — including campaigns that had never actually sent that person an invite. Fix: an acceptance can now only be recorded against a campaign that genuinely sent the invite. The 150 phantom prospects were reverted so their campaign could re-evaluate from scratch, along with 10 more on another account. No action needed on your side — your dashboard shows the correct picture after the revert.
6) InMail count showing 0 in dashboards (fixed Apr 30) Symptom: you can see InMails landing in your LinkedIn outbox and your campaign's 'InMails sent' counter climbing, but a separate 'InMail volume' analytics tile reads 0. Why: completed InMails weren't being recorded in the feed that the analytics tile reads from. Both paths now record them, and the last 30 days were back-filled. No action needed on your side.
What to do if your dashboard looks wrong:
Hard-refresh the page (60-second cache).
Cross-check ground-truth: campaign-card per-step activity counter is always correct; your LinkedIn inbox/sent items is always correct.
If still wrong after 1 hour, contact support at [email protected] with your account email and a sample prospect URL — we can reconcile the numbers directly.
What to do if your campaign is auto-paused:
Check the pause reason on the campaign card. The common ones are: LinkedIn account disconnected, high failure rate, paused manually, and subscription lapsed.
LinkedIn account disconnected: open LinkedIn → Accounts, click Reconnect on the affected row, complete the LinkedIn login. Auto-resume picks up within 5 minutes.
High failure rate: review the recent errors for that campaign. The most common cause is messages firing before acceptance (point 4 above) — check that your steps have a 'wait for acceptance' or 'if the invite was accepted' check BEFORE any message step.
Paused manually: click Resume.
Subscription lapsed: settle the outstanding invoice. That is the only thing that clears this one, and the campaign resumes on its own within about a minute afterwards.
Account safety (always wins): every fix above works on data we already hold — no extra LinkedIn calls, no rate-limit risk, no account flags. The engine respects per-account daily and weekly limits, sending windows, and timezone — exactly how you configured them. We never auto-shortcut, never skip steps, never burn prospects to 'help'.
If the LinkedIn → Accounts page shows a different daily count than what your campaign card reports — for example, account shows 'invites sent today: 1' but you can see 24 messages went out per the campaign's activity log — you're looking at a counter that has fallen out of step, not a real send failure. Every message DID go out; the daily figure on the account card is simply under-reporting some of them.
Why this happens (Apr 30, 2026): There are two campaign engines under the hood — the original LinkedIn-only engine and the newer multichannel one. Both use the same weekly counter to gate your rate limits, and that counter is correct and never under-reports. The daily figures on the account card (invites today, messages today, connections today) are updated separately, and the newer engine wasn't updating them on every action.
What's correct vs what's wrong:
Correct — the weekly counter that drives rate-limit gating. Your account is never sending past your configured limits.
Correct — the daily counter on the campaign card. This is the source of truth for how many messages went out today on that campaign.
Wrong — the daily counter on the account card, which under-reported for multichannel campaigns until the fix was deployed.
How to verify the messages actually went out:
Open the campaign card and check the per-step activity counter — that's the real number.
Open the LinkedIn inbox for the account and confirm the messages are visible in your sent items.
Open the prospect and check when they were last messaged and when the campaign last acted on them.
What we shipped: Every LinkedIn action in the newer engine now updates the daily counter at the same moment it records the send, and a one-off recalculation brought the affected daily figures back in line with the real activity.
A worked example: one account's dashboard read 'messages sent today: 1' on the morning of Apr 30 even though 24 messages had legitimately gone out. Every send was real, every safety gate held, the counter just lagged.
If your counters still mismatch, contact support at [email protected] with the account email and roughly when it happened — we can recompute the daily figure for you.
If your LinkedIn campaign has a condition step (the diamond-shape step that waits for a prospect to accept or reply before advancing) and your prospects look like they've gotten 'stuck' on it — or the dashboard's 'Reserved today' number is much higher than 'Completed today' — this guide explains exactly what's happening, why, and what to do.
What is a condition step? A condition step is a branch in your campaign sequence that waits for a specific signal from LinkedIn before deciding which step runs next. The two most common conditions are: • Invite accepted — wait until the prospect accepts your connection request • Replied — wait until the prospect replies to your last message
A condition step has three parts: 1. The condition check itself (met / not met / still waiting). 2. A timeout (e.g. 'wait up to 7 days'). 3. A 'false branch' — what to do if the timeout expires before the condition is met. This is the 'if not met, go to' field in the campaign editor.
What happens at the timeout when no false branch is set If you leave the false branch empty (which is easy to do — the editor doesn't force you to pick one), the engine has no instruction for what to do when the timeout expires. As of April 30, 2026, it SAFELY ENDS the sequence for that prospect at the timeout — it does not silently advance to the next linear step, because that would fire a message at someone who isn't a connection and LinkedIn would reject it. Safe-terminate is the right behaviour for account safety, but it's invisible to you — you only see 'X prospects ended' on the dashboard with no explanation of why.
This is the source of the 'stuck on condition step' confusion. The prospect isn't actually stuck — it's been quietly terminated because the campaign config didn't tell the engine what else to do.
Examples • Example A — invite, then message, with a 7-day wait: Step 1: send invite → Step 2: condition ('invite accepted', timeout 7 days) → Step 3: send message • If the prospect accepts within 7 days, the condition is met and Step 3 fires. • If 7 days pass without acceptance and no false branch is set, the sequence safely ends for that prospect. • If the false branch points to a fallback step (for example, send an InMail), the prospect runs that step instead.
• Example B — anti-pattern (do not do this): Step 1: send invite → Step 2: condition ('invite accepted', timeout 7 days, false branch → wait for acceptance) This loops the prospect back to wait for the very acceptance the condition just said hadn't happened. Our launch check now blocks this.
The launch check (May 2026) When you click 'Launch' on a draft campaign, we now review every condition step before the campaign starts running. We block launch and show an amber 'Fix this first' banner if: • A condition step has a timeout but no false branch — you'll see: 'Condition step has no false branch — prospects who never accept will be ended silently. Add a fallback step or confirm you intend to end the sequence for them.' • A condition step's false branch points back to a wait or another condition that depends on the same signal — you'll see: 'Anti-pattern: waiting for acceptance the condition just said didn't happen. Pick a different step type for the false branch.'
Each warning has a 'Fix' link that scrolls you straight to the offending step in the editor. The validator is amber (actionable) not red (destructive) — you can fix the warning and relaunch immediately.
The Reserved · Completed · Daily Cap dashboard split (May 2026) The LinkedIn account card on your dashboard used to show a single number — 'invites sent today' or 'messages sent today'. It now shows three numbers side by side: • Reserved — how many enrollments the engine has lined up for today's window. These are queued but haven't sent yet. • Completed — how many actions actually succeeded today. This is the ground-truth number that matches your LinkedIn inbox/sent items. • Daily Cap — your account's safety limit (set by your ramp schedule and account age).
Reserved is always ≥ Completed because the engine reserves capacity at the start of the window and consumes it as sends complete. If Reserved=149 and Completed=31, that means the engine planned to send 149 today but has only finished 31 so far — the rest are still queued or waiting on per-account spacing. This is how the engine has always worked; we just stopped hiding the reservation count behind the completion count.
If you see Reserved much higher than Completed late in the day, it usually means the per-account spacing is throttling sends (account safety always wins over throughput) or your sending window is shorter than the engine needs to finish the queue. Neither is a bug.
What to do if you have already-stuck prospects If you have prospects left over from before this fix landed — ones that skipped past a condition step and then sat there — we ran a cleanup on April 30 and May 1, 2026 that marked them as stopped, so they are cleanly out of the queue and no longer show as pending on your dashboard. It was a one-off; you don't need to do anything. Your active prospects (those who DID accept, or are still within their wait window) are unaffected.
Account safety (always wins) Every fix on this page works on data we already hold — no extra LinkedIn calls, no rate-limit risk, no account flags. The engine respects per-account daily/weekly limits, sending windows, and timezone exactly as you configured them. We never auto-shortcut a step, never auto-skip a wait, and never burn prospects to 'help' you. If a step terminates, it's because your campaign config (or the safety-wins rule) instructed it to.
When to ask support • If you launched a campaign before the launch check landed and are seeing 'X prospects ended' with no clear reason, email [email protected] with the campaign name. We'll check whether you hit the silent-end path and, if so, walk you through fixing the condition step's false branch and re-enrolling the affected prospects. • If your dashboard's Reserved · Completed · Cap split looks wrong (for example, Completed higher than Reserved, which should never happen), contact support — that's a counter out of step and we want to investigate it.
If your LinkedIn campaign isn't sending — or your dashboard is showing numbers that don't match your LinkedIn inbox — there are four common patterns we know about, and as of May 1, 2026 every one of them has shipped fixes. This page walks through each pattern, why it happens, and what to do.
Why am I seeing 0 invites sent today even though the campaign is running?
Symptom: your LinkedIn → Accounts page shows 'invites sent today: 80/80' (or a similar capped number), every new send attempt errors with 'daily limit reached', but only 7-12 sends actually completed today.
Why (May 1, 2026): the daily counter that gates your rate limits had drifted upward and stayed there. The routine that is supposed to correct drift could only ever move the counter up, never down, so once a bad value was recorded it stuck. Net: the counter said 142, the reality was 12, and the rate-limit gate blocked every new send.
Fix: the correction routine now recalculates the day's figure from what actually completed plus what is currently in flight, and ignores the previously stored value entirely. Sends still increase the counter live as they happen; the correction routine is purely a repair pass. A one-off repair ran on May 1 across all active accounts and brought 41 of 51 back down to reality — for example 142 to 12, 87 to 9, and 73 to 7.
What to do: nothing. The repair has already run. If you still see the symptom, hard-refresh your dashboard (there is a 60-second cache) and check the per-step counter on the campaign card — that one is always accurate. If they still disagree after 24 hours, contact support at [email protected].
Why does my dashboard show '0% accept' when I have replies?
Symptom: a campaign showed 'Acceptance rate = 18%' with 47 accepted prospects listed — but the LinkedIn inbox and the campaign activity log showed only 31 real accepts. The gap of 16 was confusing.
Why (May 1, 2026): those 16 were phantom accepts that had already been reverted. They came from an acceptance being applied across every campaign a prospect was enrolled in, including campaigns that had never sent that person an invite. We deliberately don't delete the original activity records, so the statistics job was still counting the reverted acceptances alongside the real ones.
Fix: the statistics job now ignores any acceptance that was subsequently reverted. Corrected figures were back-filled on May 1 — for example 47 down to 31, 89 down to 79, and 1,208 down to 1,058 — and any further corrections appear within an hour of the next refresh.
What to do: hard-refresh your dashboard. Cross-check ground-truth against your LinkedIn inbox (always correct) and the campaign-card per-step counter (always correct). If the gap persists past 1 hour, contact support.
Why does my follow-up message never fire after acceptance?
Symptom: a campaign where step 1 (the invite) went out fine and the prospect accepted — visible both in LinkedIn and in the campaign activity log — but step 2 (the message) never fired. Behind the scenes, 28 message sends were cycling endlessly between failing and being recreated.
Why (May 1, 2026): step 2's message template contained `{{company}` — one closing brace instead of two. The typo was only caught at send time, so each attempt failed, was recreated, and failed again on the same typo, indefinitely. A fix on Apr 30 stopped those attempts piling up, but the typo itself was still sitting in the campaign with nothing in the interface telling you what to fix.
Fix: as of May 1, 2026, template syntax errors are caught the moment you save. Every template-bearing field — invite note, message template, InMail subject + body, comment template, A/B variants — is validated before the campaign is saved. If you have a typo, you'll see a soft amber Alert at the top of the editor with the message 'Step N has a template syntax error', a red border on the offending field, and a caret marker pointing at the typo. The new 'Validate' button on every step gives instant client-side feedback without a save round-trip.
Common typo shapes:
`{{company}` → fix to `{{company}}` (missing one closing brace)
`{firstName}}` → fix to `{{firstName}}` (missing one opening brace)
`{ {firstName}}` → fix to `{{firstName}}` (no space between the braces)
`{{firstName | default: 'there'}` → fix to `{{firstName | default: 'there'}}` (missing one closing brace)
What to do: open the affected campaign in the editor. The validator banner will tell you which step has the typo. Click 'Validate' on that step to highlight the exact position. Fix the typo, click Save, click Resume on the campaign card. Affected prospects retry on the next tick. No prospects are lost — they simply wait until the template is fixed. No LinkedIn action was ever attempted on the failed sends, because the typo is caught before we reach LinkedIn, so retrying costs you nothing against your limits.
Why did the Reconnect button fail with an internal error?
Symptom: several customers reported the Reconnect button failing with a confusing internal error message. Every reconnect attempt aborted without telling them anything useful.
Why (May 1, 2026): a handful of code paths were changing the account's status without also recording that change in your account history. A safety rule in our database requires the two to happen together, so it correctly rejected the change — but all you saw was the raw error.
Fix: every one of those paths now records the change alongside the status flip, so the safety rule passes and the reconnect button works. We added an automated build check so the same mistake can't be reintroduced, and 14 accounts that had been left stuck mid-connection were repaired.
What to do: try reconnecting again. The button now works first time. If you still see an error, contact support immediately — we want to find and fix any remaining path.
FAQ
Q: Will my counter ever drift again? A: The correction routine now recalculates the day's figure from scratch every 30 minutes, so a bad value can no longer stick. We also alert ourselves whenever a counter claims sends have happened while nothing has actually completed for more than two hours. Drift is detected within hours and repaired automatically.
Q: Will my prospects be lost if my template has a syntax error? A: No. Affected prospects simply wait for the template to be fixed, and we keep a record of why each one paused. They retry on the next campaign tick after you fix the template and click Resume. No prospects are dropped, no quota is consumed, and no LinkedIn actions are wasted.
Q: How do I know if my campaign was affected by the scheduling lag? A: Look for any prospect that has been sitting ready to be invited or messaged for more than five minutes past its scheduled time. The May 1 repair rescheduled 1,247 stuck prospects across 23 workspaces. If you still have any, contact support and we'll reschedule them for you.
Q: Why does the Validate button matter if templates are checked on save anyway? A: Defense in depth, plus a better editing experience. The check on save is the safety gate that actually protects you; the Validate button gives you instant feedback while you're still editing, so you can fix typos before saving. Both use the same rules — a template can never pass Validate and then be rejected on save.
Q: Will any of these fixes affect my LinkedIn account safety? A: No. Every fix on this page works on data we already hold — no extra LinkedIn calls, no rate-limit risk, no account flags. The engine respects per-account daily and weekly limits, sending windows, and timezone exactly as you configured them. The counter fix actually improves safety by making sure the rate-limit gate isn't blocked by a stale inflated value, and the reconnect fix means every status change on your account is properly recorded. We never auto-shortcut a step, never auto-skip a wait, and never burn prospects to 'help' you.
Why is my prospect's next-step scheduled days into the future?
Symptom: you open a prospect and see their next step scheduled one, two, or three days into the future — even though nothing has been sent to them yet and the campaign is running normally. One campaign had this on 89 prospects after the May 1 counter repair: the counter read 12 (correct), the cap was 80 (plenty of headroom), but the prospects were scheduled for May 2-4 and the campaign sat idle.
Why (May 1, 2026): while the daily counter was inflated, every false 'daily limit reached' trip pushed the affected prospects a full day forward. Several false trips on the same day compounded, so prospects that had never been contacted ended up scheduled three sending days out. Repairing the counter fixed the gate, but those deferred dates had already been written onto the prospects.
Fix: a one-off repair pulled those dates back to the next valid sending window for any prospect that hadn't been contacted yet and whose account had just had its counter corrected. The prospect and its queued action are updated together, so the two stay aligned. We ran this for you — nothing is needed on your side.
What to do: nothing. The repair covers every active LinkedIn account whose counter was corrected in the previous 24 hours. If you still see uncontacted prospects scheduled more than a day out, contact support — that would be an edge case the sweep missed. Going forward, a false 'limit reached' no longer defers a prospect by a whole day; it simply retries five minutes later.
Why does my dashboard show acceptances but my campaign isn't progressing?
Symptom: a campaign where 31 prospects accepted the invite — confirmed in the LinkedIn inbox — but WarmySender never received the acceptance signals. The dashboard showed 0 accepts and the campaign never moved past its 'wait for acceptance' step. The account had been reconnected on Apr 28 after a routine 30-day session rotation.
Why (May 1, 2026): the real-time acceptance notifications are tied to the LinkedIn session that was live when the account was registered for them. When LinkedIn rotates the session and you reconnect, the old registration is invalidated. Our reconnect flow was correctly marking the account as connected, but it wasn't re-registering the account for those notifications. So after every reconnect, acceptance signals stopped reaching us until the next platform-wide refresh, which at the time ran weekly. The acceptances were happening; they just never made it across.
Fix: reconnecting now re-registers the account for acceptance notifications as soon as the account is marked connected. If that re-registration fails, the reconnect still succeeds and we raise an internal alert so it can be repaired by hand. A daily audit also compares the registrations we hold against the accounts that should have them, and re-registers anything missing.
What to do: if you've reconnected your account at any point in the last 30 days and your dashboard shows fewer accepts than your LinkedIn inbox, click Reconnect once more (the new flow registers correctly), then give it five minutes for the audit to back-fill any acceptances the polling fallback picked up. If you still see acceptance gaps after that, contact support with the affected campaign names and we'll replay the missed signals for you. No prospects are lost — the acceptance signals are stored on our integration partner's side and can be replayed on demand.
Why does 'last activity' show an old date even though my campaign is sending?
Symptom: an account tile showed 'last activity 47 minutes ago' while the campaign was actively sending — six sends had completed on that account in the previous ten minutes. The 'last activity' pill was lying.
Why (May 1, 2026): the tile was reading the time of the last session health check rather than the time of the last real send. Health checks run every few minutes during business hours and less often outside them, so the tile reflected authentication health, not sending activity.
Fix: the tile now reads the time of your most recent completed send on that account. If nothing has completed in the last 7 days, it falls back to your most recent LinkedIn event (replies and acceptances); only if there is neither does it fall back to the last health check. The pill's tooltip now states explicitly which of the three it is showing: 'Last completed send at …', 'Last LinkedIn event at …', or 'Last health check at …'.
What to do: hard-refresh your dashboard (there is a 60-second cache). The tile should now reflect your most recent completed send. Hover over the pill to see which source it is using. If the time still doesn't match what you see in the prospect's activity log and your LinkedIn sent items, contact support — that's a counter out of step and we want to investigate it.
If you accepted a prospect on LinkedIn but the WarmySender dashboard still shows them as Invited, this guide explains how accept-detection works behind the scenes and how to bring the dashboard back in line. Most of the time the dashboard catches up on its own within seconds. When it doesn't, three short steps will fix it.
Note: a separate situation that can look like 'missed accepts' is starting/resuming a campaign that has zero enrolled prospects with a usable LinkedIn URL — the dashboard will simply sit at zero with no progress. As of May 2 2026, Resume/Start now blocks that with a soft amber Alert and an 'Import contacts' CTA so you know the campaign needs prospects with LinkedIn URLs before it can send anything. See the dedicated guide 'Why can't I resume my campaign? (No prospects with LinkedIn URL)' for details.
The five acceptance detection paths When a prospect accepts your invite on LinkedIn, our system can learn about it through any of five different signal paths — and as of May 2 2026 all five fire a Slack/n8n/Zapier notification consistently:
1. Real-time notification — the main path. Our LinkedIn provider notifies us the moment LinkedIn marks the invite accepted; we match the prospect and update your dashboard within about a second. 2. Direct prospect match — when the notification identifies a prospect you have enrolled, even if it can't be attributed to one specific campaign. 3. Sales Navigator match — when your prospect was imported from a Sales Navigator link, we decode the lead reference so it can be matched against the notification. 4. Polling — every 30 minutes we fetch a fresh view of your LinkedIn connections and reconcile it against any enrolled prospects not yet marked as accepted. This catches notifications that dropped or arrived late. 5. Already-connected detection — when a campaign tries to invite someone who is already a 1st-degree connection, LinkedIn declines the invite as unnecessary; we treat that as proof of acceptance and record it.
All five paths are safe to fire more than once and produce exactly one Slack notification per real acceptance.
Slack notifications for acceptances If you've configured a Slack webhook (Settings → Integrations), every detected acceptance sends one notification per prospect, per acceptance. As of May 2 2026, all five detection paths notify Slack consistently: the real-time notification, direct prospect matches, Sales Navigator matches, the 30-minute polling fallback, and already-connected detection. Before the fix, only the first path notified Slack; the other four updated your dashboard but Slack stayed silent. If you saw fewer Slack messages than acceptances on your LinkedIn timeline before May 2, that's why — it's now resolved. Duplicate notifications are collapsed automatically when two paths detect the same acceptance.
How accept-detection works WarmySender watches for accepts using three signals, in priority order. The first one to land wins, and the others quietly become no-ops thanks to idempotent stamping. You never get double-counted.
Signal 1 — the real-time notification (fastest, sub-second) Our LinkedIn integration partner notifies us the moment LinkedIn marks the invite as accepted. On a healthy day that arrives in well under a second. We match it to your prospect, record the acceptance time, and flip the status to Connected — all in one step, so the two can never disagree. The next campaign step (a follow-up message, for example) is queued for the next valid sending slot in your campaign window. This is the path most accepts take.
Signal 2 — account-status polling (every 30 minutes) If the notification drops or arrives late, polling catches it. Every 30 minutes we fetch a fresh view of your LinkedIn connections and reconcile the list against our records. Anything new is recorded as accepted, with the timestamp set to the actual accept time. The polling cadence is throttled to the documented per-account spacing — we never burst, never call faster than safe limits allow, even when there's a backlog.
Signal 3 — inferred from a reply (when the prospect writes back) If a prospect replies before either of the first two signals lands, we infer the acceptance from the reply itself — you can't reply to a non-connection on LinkedIn, so a reply is proof of acceptance. We record the acceptance and the reply together, and the dashboard counts both correctly. This is the rare belt-and-braces path, but it exists so a fast reply never silently swallows the acceptance.
What you'll see on the dashboard The dashboard's accept counter is computed live from your prospects — specifically, how many of them in that campaign have a recorded acceptance. There is no second cache to fall out of sync. If a prospect shows as Connected, their acceptance is recorded. If they show as Invited, it isn't yet.
'Connected' means the prospect accepted your invite and the system has recorded it. From this point forward, follow-up steps that depend on the acceptance (a 'wait for acceptance' step, or a message step) become eligible to fire on their next scheduled time, respecting your campaign's sending window and your LinkedIn account's per-day safety caps. The next campaign step does NOT fire instantly on accept — it queues for the next valid send time in your campaign's schedule plus a small random jitter so the action looks human. This is by design: account safety wins over speed.
If you suspect a missed accept (3 steps, in order) 1) Wait 30 minutes. If the webhook was dropped or delayed, the polling fallback will catch up on its next pass. Hard-refresh the dashboard after the half-hour mark — the prospect should now show as Connected. 2) Click 'Resync prospect' on the prospect detail page. If you don't want to wait 30 minutes (or you've already waited and the dashboard still shows Invited), open the prospect's detail view and click the Resync button. We re-check that one prospect's connection status and record the acceptance if it's there. Multiple clicks within the per-account spacing window collapse into a single check. 3) Contact support. If the prospect is still showing as Invited after a Resync click, email [email protected] with the prospect URL and the campaign name. We can record the acceptance from our end and confirm whether the issue is ours to fix or something to raise with our integration partner.
Account safety We never make extra LinkedIn calls just to verify state. Every shortcut you can imagine — 'just poll on demand,' 'just re-fetch the relations list every minute,' 'just confirm before stamping' — risks tripping LinkedIn's automation detection and getting your account restricted. A banned LinkedIn account is unrecoverable. So our default is the opposite: poll at the documented per-account spacing, lean on webhooks for fast updates, and accept that some accepts arrive a few minutes late rather than risk an account flag.
The polling fallback is throttled to the documented per-account spacing our integration partner publishes. We do not exceed that pace, even when there is a backlog of prospects waiting on accept signals. If your dashboard takes 30 minutes longer than usual to reflect an accept, that's the safety envelope holding — not a bug.
Examples Example 1 — the webhook path (most common): 'I accepted the prospect's invite on my phone at 3:14 PM. The dashboard updated 8 seconds later.' That's signal 1: our LinkedIn provider notified us the moment LinkedIn registered the acceptance, we matched it to the prospect in your campaign, and they flipped to Connected before you put your phone down. The next follow-up step is queued for your campaign's next valid sending slot.
Example 2 — the polling fallback (rare): 'A prospect accepted my invite yesterday afternoon. I checked the dashboard this morning and she's still showing as Invited.' That's a missed notification. Don't panic: open that prospect's detail page and click 'Resync prospect'. The resync fetches their latest connection status within the per-account spacing window, finds the acceptance, and records it. The prospect flips to Connected within a few seconds, and the follow-up step is queued for the next valid sending slot. No prospects are lost.
If you click Resume or Start on a LinkedIn campaign and the action is blocked with a soft amber Alert that says 'No prospects with LinkedIn URL', this section explains why we block it instead of letting the campaign 'run' silently with nothing to send.
What the Alert means: your campaign has at least one active LinkedIn step (invite, message, InMail, profile view, or any wait or condition step), but none of your enrolled prospects have a usable LinkedIn identifier — no profile URL and no LinkedIn ID on file. LinkedIn steps have no way to identify a recipient without one, so the campaign would sit at 'running' while skipping every single prospect for the same reason. As of May 2 2026, we block Start and Resume up front with a clear amber Alert and an 'Import contacts' button.
What to do: (1) Click 'Import contacts' to open the campaign edit page. (2) Re-import your CSV — make sure your LinkedIn URL column is mapped to the LinkedIn URL field during the column-mapping step. Both standard profile links (linkedin.com/in/...) and Sales Navigator links (linkedin.com/sales/lead/...) are accepted; we resolve the latter for you. (3) Alternatively, if your prospects already exist in your workspace with LinkedIn URLs, edit the campaign's audience or prospect list to include them. (4) Click Resume again. The check passes and the campaign starts running.
If you start campaigns through the API: Start and Resume are refused while the audience has no LinkedIn-addressable prospects, with a clear reason in the response. Treat it as a permanent failure for the current campaign state — retrying without first importing prospects gives the same result.
Account safety: this is a read-only check against data we already hold — no extra LinkedIn calls, no rate-limit risk. It runs only when a campaign moves into the running state, so a campaign already running is never re-evaluated retroactively. Email-only campaigns are unaffected, since the check only applies when there is a LinkedIn step.
Why my campaign appears stuck
Common causes
Account safety wins over speed. LinkedIn outreach respects daily and weekly caps that scale with a 4-week ramp; week 1 caps are intentionally low to protect the account from a permanent ban.
Step wait days are honored. A 7-day wait between two LinkedIn steps means 7 calendar days will elapse before the next action — the system executes campaigns exactly as configured, with no auto-shortcuts.
Sending window clamping. Each campaign has a sending window (e.g. Mon-Fri, 09:00-17:00). Actions scheduled outside this window are deferred to the next valid slot.
Account disconnected. If the LinkedIn cookie expires, the campaign auto-pauses with reason linkedin_account_disconnected. Reconnect the account in Settings › LinkedIn — the campaign resumes within one scheduler tick (5 minutes).
Transient stuck-processing storm. A historical bug between Apr 21-27, 2026 left some send jobs with very long retry backoffs; recovery scripts have been run platform-wide and the underlying cause is fixed.
How to verify in the UI
Open the campaign and check the status pill. running means active; paused shows a reason.
In the campaign detail view, look at Next Action for each prospect — the timestamp is the actual next attempt time after sending-window and ramp clamping.
On the LinkedIn account card, check ramp week (1-4) and remaining daily / weekly headroom.
Open the Activity tab on a prospect for the full audit trail of attempts and errors.
How LinkedIn webhooks work end-to-end
Configuration
Settings › Webhooks › New Webhook. Paste your endpoint URL (Slack Incoming Webhook, Zapier Catch Hook, n8n / Make HTTP Trigger, or your own HTTPS endpoint).
Pick the events: linkedin.invite_accepted, linkedin.message_sent, linkedin.reply_received, linkedin.account_disconnected. Subscribe to * for everything.
Click Test webhook — WarmySender fires a sample linkedin.invite_accepted payload to your URL.
{
"event": "linkedin.reply_received",
"id": "evt_2026_04_27_dd44ee55ff66",
"occurredAt": "2026-04-27T14:08:55.211Z",
"workspaceId": "ws_abcdef0123456789",
"data": {
"campaignId": "camp_8c2f...",
"prospectId": "prs_4a7b...",
"messageBody": "Hi — yes, happy to chat next week. What works for you?",
"isFirstReply": true
}
}
HMAC-SHA256 signature verification
Every outbound webhook carries an X-Warmy-Signature header containing the lowercase-hex HMAC-SHA256 of the raw request body, keyed by your endpoint secret. Verify with constant-time compare:
// Node.js
import crypto from "node:crypto";
const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) abort();
Slack-specific behavior
If your URL ends in hooks.slack.com/services/... WarmySender auto-detects it and reformats every event as a Slack Block Kit message — no custom transform needed.
Retries and dead-letter
Failed deliveries retry up to 10 times with exponential backoff (1m, 5m, 25m, 2h, 12h, capped at 72h). Each attempt is recorded in Webhooks › Logs (30-day retention). Final failures land in the workspace dead-letter queue and notify the workspace owner.
How is InMail delivery verified?
Every LinkedIn InMail send goes through a strict delivery-proof gate before WarmySender will count it as a successful send. The gate works at the platform-contract level: the LinkedIn integration returns a conversation identifier when a real InMail lands on LinkedIn's side. WarmySender treats that identifier as the proof-of-delivery fingerprint: if it's missing, the send is treated as a silent drop, the dashboard counter does not increment, the daily InMail cap is not consumed, and the prospect's last-messaged timestamp is left untouched.
What changes for you
Dashboard counters now match reality. If the InMail count says 12, those are 12 InMails LinkedIn actually queued — each tied to a conversation we can prove with a forensic record.
Reserved capacity slots are released on silent drops. If LinkedIn silently rejects an InMail (rare, but it happens), the slot is given back to today's cap immediately rather than being wasted.
No double-sends. Cross-step idempotency now skips a duplicate InMail to the same prospect even if a later step in your sequence is configured to send another. We never send a second InMail to a prospect who already received one in this enrollment.
What you'll see in your activity history
Every send is recorded with a structured entry your support team can reference:
On a failure, the same entry appears with deliveryProven=false and a reason such as eligibility, rate limit, or missing confirmation, plus the underlying detail from LinkedIn. Customer support uses these records to confirm whether a "missing send" was a phantom drop (now blocked) or a genuine eligibility skip (recipient closed their account, etc.).
Backfill of historical phantom sends
Pre-fix the platform was misclassifying every InMail failure as a successful send. The historical phantom rows are being annotated as phantom rather than deleted — preserving the audit trail while excluding them from "sent" counts going forward. Your dashboard counts will go down briefly when this annotation runs; that drop reflects the truth, not a bug.
Why we don't make extra verification calls
WarmySender's account-safety contract is "every LinkedIn API call is a potential rate-limit hit, every rate-limit hit is a potential restriction." We do not make a follow-up call to "confirm" each send — instead, we rely on the conversation identifier returned by the original send call. This keeps the per-account API budget exactly the same as before the fix, while delivering 100% accuracy on the delivery counter.
Account types and InMail credits
What each LinkedIn plan unlocks
Account type
InMails / day
Connection invites / week
Notes
Free
0 (no InMail credits)
100 / week capped by ramp
Cold messaging only via accepted connections.
Premium
25
100 / week capped by ramp
Default conservative paid tier.
Sales Navigator
50
100 / week capped by ramp
Best for cold outreach to non-connections.
Recruiter / Recruiter Lite
50
100 / week capped by ramp
Recruiter-only message templates supported.
If the account type is unknown, WarmySender defaults to Premium (a conservative paid tier) — never to Free, because Free has zero InMail credits and would silently block all InMail sends.
If an account triggers a LinkedIn restriction, WarmySender auto-switches to recovery mode with ramp_week=1 and a fresh ramp_start_date so the account re-warms safely from scratch.
What happens when InMail credits run out
When your Sales Navigator (or Premium / Recruiter) account uses its last InMail credit and LinkedIn reports "not enough credits", WarmySender stamps an account-level credits-exhausted flag. For the next 24 hours every InMail step on that account is skipped — the prospect advances to the next step in your sequence (or completes the sequence if InMail was the last step) instead of holding a slot in the campaign’s daily send budget. After 24 hours WarmySender re-tries one InMail; if your credits have been topped up the flag clears automatically and normal sending resumes. This protects your daily send budget so connection invites and follow-up messages keep flowing while InMails are paused, and it prevents a doomed call burning your per-account API budget. Sales Navigator credits also fully reset on the 1st of every calendar month — that auto-clear is independent and stricter.
Why isn’t my campaign sending faster?
Every LinkedIn campaign in WarmySender passes through a stack of caps before each action fires. Sending throttle is never the result of a single number — six independent caps are evaluated for every send, and the LOWEST one wins. The Throttle Diagnostic panel on the campaign detail page surfaces which cap is binding right now so you do not have to reason about the stack manually.
The cap stack — in evaluation order
LinkedIn safe rates (per-account ceiling). The documented top-of-band per LinkedIn plan. Free = 0 InMails / 100 invites per week. Premium = 25 InMails / day, 100 invites / week. Sales Navigator and Recruiter = 50 InMails / day, 100 invites / week. These ceilings cannot be raised by any setting in WarmySender. See Account types & InMail credits.
Account-type 4-week ramp. Even on a Sales Navigator account, week-1 starts well below the ceiling. Each calendar week after connection, per-action caps step up: invites 25 → 40 → 50 → 50, messages 75 → 100 → 125 → 150 (Sales Nav). The ramp protects new accounts from a hard restriction in the first month.
Strategy ramp. Independent from the account-type ramp. Selected at connection time based on declared account age: new_account (6-week ramp), established (4-week), veteran (2-week), recovery (8-week, after a restriction), custom (user-defined, no ramp). The strategy ramp clamps invites, messages, InMails, profile views, and engagements per week. Final cap = MIN(account-type ramp, strategy ramp).
Campaign daily_send_limit. The per-campaign budget you set in the wizard. Counted as the SUM across action types — one invite + one message + one InMail = three of the daily budget.
Per-action sub-caps. Each action type has its own daily ceiling: invites/day = ceil(weekly/7) with a floor of 10, messages/day from the strategy, InMails/day from MIN(strategy, account-type cap, custom override, hard cap = 50), profile views/day from the strategy. Hitting one sub-cap blocks ONLY that action type — the campaign keeps sending other action types.
Per-account weekly invite cap. 100/week for paid accounts (Sales Nav can stretch to 200), 100/week for free. The weekly counter resets every Monday at 00:00 UTC. Hitting this is the most common “why is my campaign frozen until next week” pattern.
InMail credits. Sales Navigator includes 50 InMail credits / month, Premium includes 5, Recruiter 100+. When LinkedIn returns “Not enough credits” on a send, an account-level circuit-breaker (inmail_credits_exhausted_at) blocks all InMail steps for that account until LinkedIn refills (top of next month for Sales Nav). Invites and regular messages keep flowing.
Cooldown signal (cannot_resend_yet). If LinkedIn returns HTTP 422 with cannot_resend_yet, WarmySender sets a 4-8h account-level back-off and ALL action types pause. Every retry inside the window deepens the cooldown. See Cooldown troubleshooting.
Worked example — Sales Navigator veteran, week 4
You have one Sales Navigator account on the veteran strategy (2-week ramp, completed) and a campaign with daily_send_limit = 50 running invite-only steps. Mon-Fri, 09:00-17:00 UTC.
Cap layer
Value
Effective per day
LinkedIn safe rate (Sales Nav, paid)
100 invites / week
~14 / day (spread)
Account-type ramp (week 4)
50 invites / day
50 / day
Strategy ramp (veteran, week 4)
200 invites / week
29 / day
Per-account weekly invite cap
200 / week
29 / day
Daily invite sub-cap
ceil(200 / 7)
29 / day
Campaign daily_send_limit
50 / day
50 / day
Binding cap
MIN of all rows
29 invites / day
The Throttle Diagnostic panel will say: “Daily invite cap reached — resumes tomorrow at midnight UTC” once 29 invites have fired, even though the campaign daily limit is 50. The narrowest cap wins. Raising daily_send_limit to 100 would NOT help — the strategy/weekly ramp still tops out at 29 invites/day. To send more: (a) wait for the strategy ramp to complete and weekly cap to widen, or (b) add MORE LinkedIn accounts to the campaign so each operates within its own ramp.
Common diagnostic outputs & what to do
What the panel says
What to do
Daily send limit reached
Wait — resets at midnight UTC. To raise, edit the campaign and increase daily_send_limit, but only if the per-action / weekly caps still have headroom.
Invite cap reached for this week
Wait until Monday — weekly counter resets at 00:00 UTC. Or add another LinkedIn account to the campaign — each gets its own weekly bucket.
InMail credits exhausted
Top up credits in LinkedIn. Sales Nav refills 50/month at the top of each calendar month. The breaker auto-clears on first successful InMail or month rollover. InMail steps are skipped meanwhile; invites and messages keep flowing.
View profile cap reached
Wait — resets at midnight UTC. View-profile is a soft action; campaigns rarely use it as a hard step.
Account on conservative ramp (week N of M)
Wait one calendar week or change strategy. Strategies can be changed in Settings › LinkedIn › Strategy. Switching from new_account to veteran mid-flight is allowed but raises ban risk on accounts < 6 months old.
Account in LinkedIn cooldown
Wait — do NOT manually retry. Every retry inside the window deepens the cooldown. The panel shows the exact resume time.
Sending normally
No action. The campaign is firing as fast as the safety stack allows. To raise throughput: add more LinkedIn accounts or wait for the strategy ramp to complete.
Why the panel surfaces only ONE binding cap
Historical “automation stops very early” tickets came from users seeing a partially-filled campaign daily-budget bar (e.g. 30% used) and assuming the system was broken — when in fact a different lower cap (e.g. weekly invite cap) was the actual binding constraint. The diagnostic deliberately picks ONE cap to explain the throttle, with priority going to the cap that locks for the LONGEST window: cooldown > weekly > daily > ramp. The per-action breakdown rows let you verify the math.
Account-safety contract
The Throttle Diagnostic is a UX hint — it does NOT influence dispatch decisions. The actual gate is enforced on the server side. The diagnostic helper makes ZERO LinkedIn API calls and ZERO new database writes — it reads from the same data the campaign detail page already loads. Account safety always wins over throughput.
Acceptance. The prospect clicked Accept on your LinkedIn connection invitation. linkedin_accepted_at is the moment LinkedIn marked the invite as accepted. Always fires on the first acceptance, even if the prospect replies in the same minute.
Reply. The prospect sent at least one inbound message in the LinkedIn conversation. linkedin_replied_at is the inbound message receive time. A reply forensically implies acceptance, but acceptance does not imply a reply.
Example timeline A — accept, then a follow-up message, then a reply
Day 0 09:00 Step 1 invite sent (linkedin_invite_sent_at)
Day 2 14:12 Acceptance webhook fires (linkedin_accepted_at)
Day 3 09:00 Step 2 follow-up message (linkedin_last_messaged_at)
Day 5 17:42 Inbound reply (linkedin_replied_at)
Counters at Day 5: acceptance=1, reply=1, accepted_to_reply=3d 3h
Example timeline B — reply webhook lands before acceptance webhook
Day 0 09:00 Step 1 invite sent
Day 0 09:18 Reply webhook 09:18:42; acceptance webhook 09:18:48
Both counters stamp:
linkedin_accepted_at = 09:18:48
linkedin_replied_at = 09:18:42
Even when the reply webhook lands first, the acceptance helper still stamps linkedin_accepted_at — both counters reflect reality. The status flip to connected is suppressed because replied is a strictly later state, but the stat counter is independent of the status field.
Daily send limit and LinkedIn capacity
Each campaign has a Daily limit setting that caps how many actions the campaign can take per day. For LinkedIn campaigns the right value depends on your account's tier and ramp strategy: a Sales Navigator account can sustain ~28 invites/day plus messages and profile views, while a brand-new Free account should stay below 80 actions/day. If your campaign's daily limit is set below what your account can produce, the cap becomes the binding constraint and your campaign will throttle below LinkedIn's safe production rate. WarmySender now picks a tier-aware default at campaign creation and shows a warning banner on the campaign detail page when the cap is below the account's expected daily capacity.
Recommended daily limit by account tier
LinkedIn account tier
Recommended daily limit
Why
Free
75/day
Conservative ramp; no InMails; LinkedIn watches free-account volume closely.
Premium
150/day
Headroom for invites + messages + profile views; ~5 InMail credits per month.
Sales Navigator
250/day
200 invites/week + 100 profile views/day + up to 50 InMails/day fits inside.
Recruiter
250/day
Same daily-action ceiling as Sales Navigator on the safe band.
How the smart default is computed
When you create a LinkedIn campaign and don't set the daily limit yourself, WarmySender picks a default using the formula (maxInvitesPerWeek / 7) × 2 + 50, rounded to the nearest 25 and clamped to the per-tier safety bounds in the table above. The ×2 + 50 headroom covers messages, profile views, and engagements that share the daily budget alongside invites. Your account's per-account ramp gate is still the master ceiling — this default just makes sure the campaign cap doesn't strangle a healthy account.
If you really want a low limit
The server refuses to save a daily limit that's below your account's expected daily invite rate, because it almost always means you'll under-utilize your account. If you have a reason to keep the cap intentionally low (e.g. testing a single-prospect drip), pass ?force_low_limit=1 on the API request, or raise the limit and use a smaller prospect list instead.
Merge Tags & Personalization
Merge tags personalize each email by inserting prospect, sender, and campaign data at send time. They work in the subject line and body of every campaign step, and use Liquid syntax: {{ tag_name }}.
Both {{first_name}} and the camelCase alias {{firstname}} work — same for {{last_name}} / {{lastname}}. Pick whichever style your team prefers and stay consistent inside a single template.
Filters (Liquid)
You can chain Liquid filters onto any merge tag. The most useful one is default, which provides a fallback when a field is missing on a prospect:
Hi {{first_name | default: "there"}},
Other supported filters: upcase, downcase, capitalize, truncate, strip.
What NOT to do
Don't put placeholder text inside {{ }}. The double curly braces are reserved for merge tags. Writing {{people/ops/talent}} will cause a template error and pause your campaign with reason template_error.
Use plain text for fill-in placeholders (e.g. write people/ops/talent directly in the body), or use a real merge tag ({{title}}) backed by a CSV column.
Examples
Subject line:
Quick question for {{first_name}} at {{company}}
Renders as: Quick question for John at Acme Inc.
Opening line with fallback:
Hi {{first_name | default: "there"}}, I noticed {{company}} recently expanded into {{city | default: "your region"}}.
If first_name is missing on a prospect, the email opens with "Hi there," instead of "Hi ,".
Custom CSV field:
{{custom.icebreaker}}
Would a quick 15-min call next Tuesday work?
Any CSV column you upload becomes available as {{custom.<columnName>}}. You can make EVERYTHING a variable — subject, first line, entire paragraphs.
Warmup Pipeline Health
How the dashboard counter, deliverability stats, and pause reasons work — read this if your warmup numbers look surprising.
Daily counter — what "today's sends" really means
The warmup dashboard shows a Sent today tile per mailbox. That number comes from the warmup_sent_today counter on the mailbox row, which increments by one each time the warmup engine successfully hands a message to your SMTP server. The counter is reset to zero at your mailbox's local midnight — not at global UTC midnight — so a Pacific-time mailbox flips at 00:00 PT (08:00 UTC) and an Australian mailbox flips at 00:00 AEST (14:00 UTC the day before). The reset job runs every five minutes and is idempotent; a deploy or restart in the middle of the day will never cause a double-reset.
Example: on Friday at 9 am Pacific your dashboard might show 12 sent; by 6 pm Pacific the same day you will typically see 30+ as more sends complete throughout your warming window. The number only ever grows during the day and resets cleanly at your local midnight.
During the day, the counter may briefly diverge from the per-mailbox event log by one or two if the engine is mid-flight between "message sent" and "counter incremented." Both writes happen inside a single transaction, so the drift never exceeds the in-flight count and self-corrects within seconds. The dashboard API also reconciles the displayed value against the event log so a stale counter can never display a wildly wrong number.
Deliverability lag — why the inbox/spam % grows during the day
After a warmup message is sent, the recipient mailbox needs a few minutes to receive it, the IMAP scanner needs to discover it in the INBOX or SPAM folder, and the engine then records the placement. The full cycle typically takes 3–30 minutes from send to detection, but can stretch to a few hours during heavy provider load. This means the Inbox % and Spam % metrics on the dashboard reflect completed detections, not just sends — so they will visibly climb throughout the day as the morning's messages get scanned.
If you check at 9 am you might see 30 sent but only 8 detected, giving a deliverability metric based on those 8. By 6 pm the same day, the same metric typically reflects 25–30 detections out of 30 sent — a much more accurate picture. Never panic over an inbox % computed before lunch; let the day complete before drawing conclusions.
Why warmup paused — reading the pause reason
When warmup stops on a mailbox, the system records a structured pause reason that tells you exactly why. Reasons fall into two broad groups: billing (your subscription or trial cannot keep funding warmup) and technical (the mailbox itself is failing). Resume the right way for each.
Why it paused
What it means
How to resume
Your free trial ended
Warmup needs an active plan behind it, so it pauses when a trial finishes without one. Your campaigns stop sending at the same time, and everything you built is kept exactly as it is.
Pick a plan under Billing. Warmup and your campaigns come back on their own a few minutes after the payment goes through — your warmup progress is kept, so you don't restart the ramp from day one.
An invoice is outstanding
Your most recent payment did not go through. Warmup pauses while an invoice is unpaid, so we never warm a mailbox without an active plan behind it. Your campaigns pause with it.
Settle the invoice under Billing. The banner there names it and says whether your bank needs to approve the charge, the card needs replacing, or the payment is still being processed. Once it clears, warmup and campaigns restart on their own within a few minutes, with your progress kept. There is nothing to press — and switching warmup on yourself beforehand will not work, because warmup needs an active plan.
Your plan ended
The subscription was cancelled, or an unpaid invoice was never settled and the retries ran out.
Choose a plan again under Billing. Your mailboxes, prospects and campaign data are all retained; warmup resumes within a few minutes of the new plan starting.
Your inbox credentials stopped working
The username, password or app password we hold for this mailbox no longer signs in — usually because it was rotated, revoked, or two-factor settings changed at your email provider.
Reconnect the inbox. Mailboxes › click the affected row › Reconnect. As soon as the new credentials test successfully, the pause clears and warmup carries on.
Repeated sign-in failures
Several failed sign-ins in a row triggered an automatic safety pause, so we stop retrying a credential your provider is already rejecting.
Reconnect the inbox — same path as above. The pause clears the moment the reconnect test passes; there is no waiting period and nothing else to do.
Someone turned warmup off
You, or a teammate on your workspace, switched warmup off for this mailbox.
Turn it back on from the Warmup page. There is no cooldown. One thing to know: this works while your plan is active — if there is an unpaid invoice or no plan on the account, the switch is refused until that is sorted out first.
If a mailbox shows warmup active in the UI but is generating zero sends and zero detections, look at the per-mailbox detail page first — the pause reason will be displayed there even if the high-level toggle still reads on.
I fixed my billing but my warmup is still paused — what should I do?
When a renewal payment doesn't go through, WarmySender pauses warmup on your mailboxes. This is a deliberate safety pause: we never warm a mailbox without an active plan behind it, because warming an inbox you're no longer paying for can do more harm than good to your sender reputation. The same rule applies across all four pillars of the platform — cold email campaigns, email warmup, LinkedIn outreach, and multichannel sequences all wait for an active plan before they run.
Once your payment clears and your subscription is active again, warmup resumes automatically within a few minutes — you don't need to restart anything, and your earlier warmup progress is preserved, so your mailboxes pick up where they left off instead of starting the ramp from day one. To clear the pause: update your card under Billing › Payment Method, confirm the payment goes through, and give it a few minutes.
Settling the invoice is the only thing that clears this, and it is worth saying plainly why. Switching warmup back on yourself first does not work: warmup needs an active plan behind it, so the switch is refused while an invoice is outstanding — and if it did flip on, a routine check would restore the pause a few minutes later. Rather than leave you pressing a button that cannot succeed, we would rather tell you: pay the invoice, then wait a couple of minutes and everything returns by itself. If a mailbox is still paused well after your payment has cleared, open its per-mailbox detail page to see the current reason, or contact us at [email protected].
When in the day does warmup send?
Warmup runs around the clock. We deliberately spread your warmup messages across all hours of the day rather than confining them to set "office hours" — genuine inboxes receive mail at every hour, so steady round-the-clock activity looks more natural to inbox providers than traffic squeezed into a narrow daily window. Because of this, warmup has no per-hour send window to set: every enabled mailbox automatically sends a small, steadily-ramping number of messages spread throughout the day.
What changes over time is the number of messages per day, which ramps up gradually as your mailbox builds reputation (see the ramp section below) — not the hours they go out in. Time-of-day control for your own prospect outreach is set per campaign, separately from warmup.
Ramp — how the daily limit grows over time
A brand-new mailbox is not sent at its warmup_target_daily_volume on day one. Instead the engine uses warmup_current_daily_limit, which starts low (typically 5–10 messages on day one) and ramps upward each day toward the target. The ramp speed depends on the mailbox's warmup mode (new_mailbox, new_domain, maintenance, recovery) and on the mailbox's recent health (spam rate, bounce rate, inbox placement).
Once a mailbox graduates to maintenance mode (about 14 days old with a clean health profile), the per-day limit converges on your configured target. If health deteriorates the engine can throttle the limit back down automatically — that's a feature, not a bug.
When numbers look surprising — quick diagnostic checklist
Check the timezone. If "Sent today" looks higher than expected, confirm the mailbox warmup_timezone matches your real geography — a misconfigured timezone makes "today" cover up to 48 hours of real sends.
Wait until end-of-day. Deliverability % grows throughout the day as detections complete. Morning numbers under-report; end-of-day numbers are accurate.
Read the pause reason. If sends are zero, the per-mailbox detail page shows exactly why — match the reason against the table above.
Reconnect if needed. Almost every technical pause clears with a successful Reconnect from the Mailboxes page; you do not need to contact support first.
Be patient on day one. A new mailbox is intentionally throttled by the ramp; a low send count on day one is the platform protecting your domain reputation, not a failure.
Need More Help?
Contact us at [email protected] — we respond within 24 hours on business days.
Go to Mailboxes > Add Mailbox. For Outlook/Microsoft 365, click 'Connect with Microsoft' to sign in with OAuth. For Gmail/Google Workspace, connect with an app password over IMAP/SMTP — turn on 2-step verification, generate an app password, and paste it into the connect form. Other providers connect with IMAP/SMTP credentials the same way.
How do I start email warmup?
After connecting your mailbox, go to Warmup Settings and toggle warmup ON. Set your daily warmup volume (we recommend starting at 5-10 emails/day) and WarmySender will automatically send and reply to warmup emails.
How do I create a cold email campaign?
Go to Campaigns > Create Campaign. Add your prospect list, write your email sequence (up to 7 steps), set sending schedule and timezone, then activate the campaign.
How do I set up LinkedIn automation?
Purchase a LinkedIn seat add-on ($15/seat/month), then go to LinkedIn > Connect Account. WarmySender uses an official OAuth integration for safe authentication — no password sharing required.
What email providers does WarmySender support?
Gmail, Google Workspace, Outlook, Microsoft 365, Yahoo, Zoho Mail, Hostinger, iCloud, Fastmail, ProtonMail, and any provider with IMAP/SMTP access.
How do I check my email deliverability?
Go to your Mailbox dashboard to see inbox placement rate, warmup score, and sender reputation. WarmySender tracks these metrics automatically for all connected mailboxes.
How do I import prospects for campaigns?
Go to Prospects > Import. Upload a CSV file with columns for email, first name, last name, and company. You can also add prospects manually or use the built-in B2B lead database.
What is Bounce Shield and how does it work?
Bounce Shield is WarmySender's built-in email verification. It checks prospect addresses before sending and holds back the ones confirmed undeliverable, removing most avoidable bounces and protecting your sender reputation. It runs automatically on campaign activation. Verification reflects the moment it runs, so a verified list can still bounce a little.
Why is LinkedIn enrichment taking so long?
Enrichment is rate-limited to protect your LinkedIn account. Daily caps range from 10-100 profiles/day depending on account age and strategy. New accounts start at ~10/day and increase each week. You can start campaigns immediately without waiting for enrichment.
Why does enrichment use my LinkedIn account instead of a system account?
LinkedIn requires an authenticated session to view profiles — there is no public API. A shared system account would be banned within hours. Using your own account also provides network-specific data like connection degree. All LinkedIn automation tools work this way.
Can I start a LinkedIn campaign without enrichment?
Yes. Campaigns only need LinkedIn profile URLs to function. Enrichment adds extra data (name, company, headline) for personalization but is completely optional. Create and launch your campaign immediately — enrichment runs in the background.
My LinkedIn enrichment failed — what should I do?
Common causes: account disconnected during enrichment, circuit breaker triggered after 10+ errors, or audience was deleted. Reconnect your LinkedIn account, go to Audiences, and click Restart Enrichment. Previously enriched profiles are cached.
Why does my campaign say 'paused' with no reason?
This was a real bug, fixed in late April 2026. Earlier, a campaign could be paused without recording a pause reason, so the auto-resume sweeper couldn't tell whether the underlying issue (account disconnect, high failure rate, etc.) had cleared. The fix records a structured pause reason on every pause and rejects any future regression at the database layer. Open the campaign detail page and look at the pause reason — it now always tells you why the pause happened (account disconnected, high failure rate, subscription canceled, etc.). If the field is still empty, your campaign predates the fix; click Resume once and the system will re-evaluate the row, populate a reason if there's a real cause, or move it back to running if not. Your prospects, sequences, and analytics are completely untouched by the fix.
I imported Sales Navigator URLs but most of my prospects didn't get invites — what happened?
Sales Navigator URLs (the form `https://www.linkedin.com/sales/lead/ACoAAA...,NAME_SEARCH,XYZ`) sometimes can't be resolved to a public LinkedIn profile. This happens for restricted profiles, recently-deleted leads, and a known issue with certain `,NAME_SEARCH,` query suffixes. Before late April 2026, when resolution returned nothing, our campaign engine treated the prospect as 'cannot be invited, mark complete' — silently completing the prospect with zero invite attempt. The fix shows affected prospects as Unresolved URL and retries with exponential backoff up to 5 times before promoting to a terminal Failed state. They never complete silently again. To recover prospects affected by the old behavior: re-import them with regular `linkedin.com/in/<handle>` URLs (most reliable), or run the recovery routine which automatically re-stamps eligible prospects so they re-enter the queue on the next campaign tick. Your campaign config and other prospects are untouched. If you're unsure whether your import is affected, contact support — we can check the resolver outcome for any prospect by ID.
I see my invite counter went up but the dashboard says 0 invites — is the counter wrong?
No, the counter is correct. WarmySender ships two LinkedIn campaign engines that both increment the weekly invite counter on your account: a standalone engine (LinkedIn-only campaigns) and a unified multichannel engine (campaigns combining email and LinkedIn steps). Both engines hit the same shared counter, but campaign activity is tracked separately per engine. If the dashboard's per-campaign count looks lower than the counter, you're likely viewing a standalone campaign while the missing invites came from a unified multichannel campaign on the same account, or vice versa. The counter is the single source of truth for rate-limit gating, so it's never wrong. To see total invites across both engines for an account, the LinkedIn Accounts dashboard now shows invites sent this week vs. weekly limit directly (engine-agnostic). If the numbers still don't add up after a 5-minute refresh, contact support — we can run a canonical diagnostic.
Why am I getting 'reconnect needed' emails when my LinkedIn is showing connected?
This is a stale health flag left over from a prior upstream outage. Your account is genuinely connected and our system is communicating with LinkedIn fine — but a derived health marker didn't reset when the reconnect succeeded, and our daily alert-email job kept firing on it. The late-April 2026 fix makes this permanent: the reconnect path now resets the health marker alongside the other recovery markers, the alert email is gated to skip any connected account, and a drift sentinel surfaces any future regression to admins before customers see it. If you still see the email after the fix is deployed, click Reconnect once from LinkedIn → Accounts (your campaigns and prospects are untouched) and the flag will reset cleanly.
I see prospects who replied on LinkedIn but my dashboard says 0 replies — what's wrong?
This was a real bug, fixed in late April 2026. Reply detection was relying on a campaign attribution that wasn't being populated on inbound LinkedIn messages — neither the webhook ingest path nor the polling fallback was running the attribution lookup before storing the message. Net: every inbound LinkedIn message landed in the database with no campaign attribution, the dashboard reply count, auto-stop-on-reply check, and analytics reply-rate roll-up all silently filtered them out, and the dashboard showed 0 replies even when prospects had clearly responded. Worse: campaigns kept sending follow-ups to prospects who'd already replied. The fix adds an attribution lookup that the webhook handler and the polling fallback both run before recording inbound messages — so every inbound message is now correctly attributed to its enrollment if one exists. We also ran a one-shot 120+ row backfill that retro-fits the lookup against historical unattributed rows. Reply stats refresh within 1 hour after the backfill runs. If you still see drift after that window, contact support — we can re-run the backfill against your specific workspace.
Many of my prospects say 'Profile inaccessible' — are they lost?
No — late-April 2026 fix. Previously, every Profile-inaccessible response from LinkedIn was treated as terminal and the prospect was completed with no further retry — even though that response conflates several distinct cases, including some that are recoverable on a re-resolve (Sales Navigator URLs that didn't resolve on attempt N but resolve cleanly on attempt N+1, and URL canonicalization issues fixed by a related ID-aware fallback). The platform-wide audit found 21,868 enrollments completed this way. The fix migrates all of these to a defer-not-burn flow: the prospect's status flips to Pending Resolution instead of terminal Failed, the engine retries with exponential backoff capped at 5 attempts before promoting to terminal Failed, and the 21,868 historical rows were swept into the same recovery flow with their re-attempts spread over a 24-hour window so the queue doesn't slam LinkedIn rate limits. If you see this status: please verify the prospect's LinkedIn URL is current (regular `linkedin.com/in/<handle>` URLs resolve most reliably), and click Retry on the prospect detail page. The defer flow handles the recovery automatically — no further action needed unless you see the prospect repeatedly land back in Pending Resolution after 5 retries (which would indicate a genuinely-terminal restricted profile).
My LinkedIn replies aren't showing on the dashboard — what's happening?
If your dashboard is missing recent LinkedIn replies even though prospects are clearly replying on LinkedIn, the most likely cause is an upstream webhook outage at our LinkedIn integration. Important first: every reply is still safely in your LinkedIn inbox — nothing is lost on LinkedIn's side. The gap is purely between our integration and WarmySender, not between you and your prospect. When webhook delivery stalls, the inbound message still reaches our database via a 30-minute polling fallback, but the dashboard side-effects that the webhook normally triggers (the replied-at stamp on your prospect, the auto-stop-on-reply check, the Slack/n8n/Zapier reply notification, and the dashboard reply counter) only fire when the webhook handler runs. So during the outage you may see follow-ups continue on threads where the prospect already replied. Our detection infrastructure catches this within 15 minutes: a webhook health monitor compares the rate of inbound messages landing in our database against the rate of webhook events received, and raises an internal alert when the ratio drops. The runbook then lets us (1) escalate to restore the webhook, (2) confirm the polling fallback is bridging the gap at 30-minute cadence, and (3) once the webhook is back, run an idempotent replay backfill that re-drives the missed reply state-flips from the locally-stored inbound rows. The replay retroactively applies stop-on-reply, so dashboard counters reflect ground truth within ~1 hour of recovery. The detection and replay layer makes zero LinkedIn API calls — account safety always wins. If you suspect this is happening to your workspace, contact support at [email protected] with a sample prospect URL and approximate reply timestamp; we can verify the per-account state and confirm the recovery timeline.
I imported a CSV with custom fields but my template variables show 'undefined' — what should I do?
Late-April 2026 fix. Previously, if your campaign template referenced a custom variable like `{{custom.Linkedinconnection}}` and your imported CSV didn't have that column (typo, missing column, capital-letter mismatch), the campaign engine had two failure modes depending on the era: render the message with a literal 'undefined' and send anyway (rude), or complete the prospect as Failed with no recovery path. The fix is two-layer: (1) Validate-at-launch — the campaign launch path now enumerates every `{{custom.<name>}}` reference in your template, intersects against the actual column set in your prospect data, and BLOCKS launch with an actionable error if any references aren't satisfiable. The error names the missing column AND lists every column that DOES exist, so you can either fix the typo, edit the template to remove the missing variable, or re-import the CSV with the column populated. (2) Defer-at-send — if a template variable somehow still unresolves at send time (race: campaign launched, then the audience had a column dropped before the send fired), the runtime renderer now parks the prospect as Pending Template Variable Resolution instead of completing as Failed. The prospect re-enters the queue on the next campaign re-evaluation, so once you fix your template OR re-import the CSV with the corrected column, the affected prospects retry automatically — no manual recovery needed. If you see this on existing prospects: either edit your template to remove the missing variable, or re-import the CSV with the column populated, then click Resume — those prospects will retry within a campaign tick.
Why are some of my prospects shown as accepted but never received a follow-up message?
Three scenarios: (1) The LinkedIn account was disconnected at the moment the follow-up was supposed to fire — the engine cannot send through a disconnected account (account safety always wins) and parks the enrollment until you reconnect. The auto-resume sweep wakes parked enrollments within 5-10 minutes of reconnect. (2) The follow-up step was a 'wait for acceptance' condition that already evaluated and routed the prospect down the false branch because the wait window expired before the acceptance landed — this is the campaign's correct end state per how you configured it. (3) Silent skip from a worker race or a campaign edit mid-flight — the genuinely-stuck pattern. Symptom: the prospect shows accepted but no follow-up message went out and no error event was recorded. We ship a periodic post-acceptance enqueue helper and an orphan-job reconciler that catches these and recreates the missing send job. In late April 2026 we ran a one-shot backfill against a 422-row cohort. If you suspect a stuck row, contact support at [email protected] with the prospect URL — we can manually re-arm the enrollment. The recovery flows make zero LinkedIn API calls.
Why are my campaign stats showing zero accepts when I have replies?
Replies imply acceptance — you can't reply to a message unless you accepted the invite first. Two issues caused this. Issue 1 (fixed late April 2026): a fast-reply race where prospects accepted and replied very quickly; the old code skipped the acceptance timestamp because the row had already advanced past Invited. Fix: split the timestamp stamp from the status flip so even a fast-reply row gets its acceptance recorded for the dashboard. Issue 2 (fixed late April 2026): some analytics surfaces (the 24h freshness banner on LinkedIn → Accounts, per-account analytics roll-up) read a different event store from the campaign counter. After the engine consolidation, unified-engine campaigns wrote acceptance events to the campaign store but never mirrored to the account-level store, so the banner showed 'no accepts in 24h' even when accepts were flowing. Fix: idempotent paired insert from the canonical helper covers both stores. The campaign-card Accepted/Replied counters and the LinkedIn Accounts banner now show consistent numbers. Hard-refresh your dashboard if you still see the issue (60s cache); contact support if accept rate is 0% with replies present after the deploy date.
I see a 'Template syntax invalid' error — what do I do?
Your campaign's message template has a Liquid syntax error — most commonly a typo in a merge tag like {{company} (one closing brace instead of two). Liquid requires EXACTLY two opening braces and two closing braces around every variable: {{firstName}}, {{company}}, {{custom.subject_line}}. Before late-April 2026, this triggered an infinite retry loop — one early customer campaign had 28 follow-up jobs retrying continuously with the same '{{company}' typo until we shipped the dead-letter fix. After the fix: the engine detects the parse-error on the first attempt; the send job is marked Failed with a template-syntax-error classification; the enrollment is parked as Pending Template Fix so the orphan reconciler does not recreate the job. To fix: open the affected campaign, find every merge-tag reference and verify each has exactly TWO opening braces and TWO closing braces (common typos: {{firstName}, {firstName}}, { {firstName}}, {{firstName | default: 'there'}). Save and click Resume — affected prospects retry on the next campaign tick. No prospects are lost. No LinkedIn API calls were made on the failed attempts (the parse error fires before the LinkedIn call), so no rate-limit cost to retrying. Click Preview in the editor to see the exact line number of the parse error.
Why is my account counter different from what the campaign shows?
If LinkedIn → Accounts shows 'invites sent today: 1' but you can see 24 messages went out per the campaign's activity log, you're hitting a counter desync, not a real send failure. Every message did go out; the account-level dashboard tile is just under-reporting unified-engine sends. Why (late-April 2026): there are two campaign engines — a standalone engine and a unified multichannel engine. Both call the same shared counter for weekly rate-limit gating (always correct, load-bearing for safety, never under-reports), but the daily-bucket tiles were written by a separate post-success increment that the unified engine forgot to wire on some action sites. Sources of truth: the weekly counter (drives rate-limit gating) is always correct; the campaign-card daily counter is always correct; the account-card daily counter under-reports for unified-engine campaigns until the fix is deployed. To verify messages went out: open the campaign card and check the per-step activity counter (ground-truth); open the LinkedIn inbox and confirm the messages are visible; check the last-messaged timestamp on the prospect. The fix audits every unified-engine action site and adds the paired daily-counter increment in the same transaction; a one-shot backfill recomputes the daily buckets from event rows. One customer's dashboard showed 1 message sent on the morning of the fix day even though 24 messages had legitimately gone out — every send was real, every safety gate held, the counter just lagged. Contact support if counters still mismatch after the fix lands.
I fixed my billing but my warmup is still paused — what should I do?
When a renewal payment doesn't go through, WarmySender pauses warmup on your mailboxes. This is a deliberate safety pause — we never warm a mailbox without an active plan behind it, because warming an inbox you're no longer paying for can hurt your sender reputation rather than help it. The same rule applies across all four pillars of the platform: cold email campaigns, email warmup, LinkedIn outreach, and multichannel sequences all wait for an active plan before they run. Once your payment clears and your subscription is active again, warmup resumes automatically within a few minutes — you don't need to restart anything, and your earlier warmup progress is preserved, so your mailboxes pick up where they left off instead of starting the ramp over from day one. To clear the pause: update your card under Billing › Payment Method, confirm the payment goes through, and give it a few minutes. Prefer not to wait, or want to switch it back on yourself? Open the Warmup page and toggle each affected mailbox back on manually — it takes effect immediately and your warmup progress is still kept. If a mailbox stays paused well after your payment has cleared, open its per-mailbox detail page to read the current pause reason, or contact us at [email protected].