Documentation & Help Center

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.

Browse documentation by topic

Jump directly to a dedicated guide page:

Getting Started

Email Warmup

Campaigns

LinkedIn

Instagram

Platform

WhatsApp

Prospects & Data

Integrations

SEO & Content

SEO

Performance

Billing & Plans

Warmup

AI Agents

Troubleshooting

Getting Started

Getting Started with WarmySender

Welcome to WarmySender! Follow these steps to get up and running:

  1. 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).
  1. 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.
  1. 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.
  1. Set up DNS records — While warming up, configure SPF, DKIM, and DMARC records for your sending domain. This is critical for inbox placement.
  1. 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.
  1. 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.

Run Your Email Marketing & Outreach on Autopilot with AI (MCP)

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 65 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.

Take the Product Tour (60-second guided walkthrough)

The fastest way to get your bearings in WarmySender is the 60-second guided tour. WarmySender runs your outreach on autopilot with AI agents, and the tour walks you through every part of the app and introduces each channel: Cold Email (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 (connection requests and follow-up messages at a safe, natural pace), Instagram (follows and DMs at the same careful pace), and Multichannel (mix email, LinkedIn, and Instagram DMs into one sequence) — plus real-time email verification.

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.

Connecting Your Mailbox

To connect a mailbox:

  1. Go to Mailboxes and click 'Add Mailbox'.
  2. Select your email provider (Gmail, Outlook, Hostinger, Zoho, etc.) or choose Custom IMAP/SMTP.
  3. Enter your full email address as the username.
  4. 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.
  5. 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.
  6. Click 'Test Connection' to verify everything works before saving.
  7. 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'.

Comparing Plans: Pro vs Enterprise vs Ultimate

A detailed comparison of all WarmySender subscription plans to help you choose the right one.

Plan Overview (monthly billing):

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):

How the limited-time 55% annual offer works:

Monthly Email Quota:

Connected Mailboxes (account-wide, across all your workspaces):

Email Warmup:

Team Members (Seats):

B2B Lead Database (monthly allowance, resets on your billing anniversary):

Email Verifications (free monthly allowance, resets on the 1st of each month):

Prospect Storage:

Workspaces:

LinkedIn Add-On (available on any paid plan):

Features Included on ALL Paid Plans:

Enterprise & Ultimate:

How to Choose:

Free Trial: How It Works

WarmySender offers a 7-day free trial on the Pro and Enterprise plans — no credit card required. Whichever of them you pick, the trial gives you that plan in full for 7 days.

What You Get During the Trial:

What Unlocks When You Start Paying:

How to Start Your Trial:

  1. Sign up at warmysender.com
  2. Click 'Start 7-Day Free Trial' on a plan that offers one — the button appears on the plan card itself
  3. No credit card needed — you get instant access
  4. Start connecting mailboxes and setting up warmup immediately

During Your Trial:

What Happens When the Trial Ends:

After Trial Expiry — How to Re-Activate:

  1. Log in to your WarmySender account
  2. You will be redirected to the Billing page
  3. Choose a plan (Pro, Enterprise, or Ultimate) and subscribe
  4. Your account is immediately re-activated with all your data intact
  5. Paused campaigns and warmup can be resumed

Trial Limits:

Upgrading During Trial:

Available Resources & Getting Help

WarmySender provides multiple ways to learn and get help:

Documentation (You Are Here):

In-App Product Tours:

AI-Powered Help:

FAQ Pages:

Blog & Guides:

API Documentation:

Email Support:

Tip: For the fastest answers, try the AI assistant first — it has full context about WarmySender's features and can answer most questions instantly.

Quick Start: First Campaign in 15 Minutes

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.

Account Settings & Profile Management

Manage your account and workspace from Settings:

Account Tab:

Signing in:

Workspace Settings:

Notifications:

Data Management:

Product Tour:

Reconnecting a Mailbox Without Losing Campaign Progress

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.

How Your Free Trial Starts

Your trial is 7 days on the plan you started it on — available on the Pro and Enterprise plans. 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:

  1. Refresh the page. The dashboard reads your plan fresh on every load, so give it about 30 seconds and refresh once more.
  2. 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.
  3. 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: your plan's cold email and email warmup features — connecting mailboxes, warming them up, and building and running campaigns. Two things work differently. The email verifier is open to everyone regardless of plan — you get the free daily check during your trial, and you can buy verification credits at any time with no subscription — but your plan's monthly verification allowance starts when you pick a paid plan. 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

Bulk Import Mailboxes (CSV + Paste)

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

Connecting Mailboxes That Don't Use an App Password

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

Connect a Gmail or Google Workspace Alias Mailbox

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, the most common setup typos, and what to ask your Google Workspace administrator to check.

Full explainer: /documentation/connect-gmail-workspace-alias

Connect a Microsoft 365 Alias Mailbox

Point several Microsoft 365 or Exchange Online alias addresses at WarmySender while they all sign in through one licensed mailbox. Each alias becomes its own sender with its own From address, warmup ramp, daily limit and campaigns — no separate Microsoft licence per outreach domain. Use Custom IMAP/SMTP (not the one-click Microsoft sign-in, which connects only the address that signed in): put the alias in Email address and the licensed mailbox in Username, use port 587 for outgoing and 993 for incoming, and have your administrator switch on Authenticated SMTP and IMAP for the licensed mailbox. Aliases share that mailbox's sending ceiling, so add licensed mailboxes rather than aliases when you need more volume.

Full explainer: /documentation/connect-microsoft-365-alias

My Gmail App Password Says 'Authentication Failed'

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 usual causes: the sign-in address is an alias rather than the primary Google account, Google is running a quick one-time security check on the new password, the normal login password was used instead of the App Password, or a Google Workspace administrator has switched off the access it needs. The spaces Google shows in the password are never the problem — WarmySender removes them for you.

Full explainer: /documentation/gmail-app-password-says-auth-failed

Microsoft 365 Shows 'SMTP Disabled by Admin'

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

Email Warmup

How Email Warmup Works

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.

Warmup Settings & Ramp Modes

Each mailbox has its own warmup configuration. Go to Warmup and click on a mailbox to configure:

Ramp Speed — Controls how quickly daily volume increases:

Strategy Modes — The system uses intelligent strategies that auto-evolve based on your mailbox's age and performance:

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):

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.

How We Protect Your Warmup Emails

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:

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.

Understanding Warmup Health Scores

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 & Inbox Placement

Spam Rescue is one of WarmySender's most powerful features for building your sender reputation. It works automatically in the background, moving warmup emails back to the inbox when a provider routes 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.

What Rescue Changes — and What It Deliberately Does Not
Rescue teaches the receiving provider that your mail is wanted. That is its whole purpose, and it is why placement improves over time.

What it does not do is rewrite your numbers. Your Spam Rate records where each email FIRST landed, before any rescue. An email that arrived in spam and was moved to the inbox minutes later still counts as a spam landing for that day. We keep it that way on purpose: the first landing is the honest signal about your sending reputation, and quietly folding our own clean-up into the figure would tell you your mail is landing well when it is not.

Two things follow from that, and they surprise people:

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 Best Practices

Follow these best practices to get the most out of email warmup and build a strong sender reputation.

Do:

Do Not:

Timelines to Expect:

When to Adjust Settings:

Warmup & Campaigns: How They Work Together

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.

What to Do When Your Health Score Drops

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.

Why an Inbox Shows 'Temporary Provider Slowdown'

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.

Why Warmup Emails Appear in Your Inbox

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.

Why Warmup Emails Appear in Your Sent Folder

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.

My Sending Domain Shows on a Blocklist — What It Means & What to Do

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. On Analytics, Domain Health names which list a sending domain is on and how recently we checked it. 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.

Multi-Domain Warmup Strategy

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:

Warmup Approach:

Campaign Distribution:

Monitoring:

Common Mistakes:

Warmup FAQ: Common Questions Answered

Frequently asked questions about email warmup.

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.

Understanding the Dashboard Health Score

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:

3) LinkedIn Sub-Score (20% weight, only if LinkedIn accounts exist) — Based on:

4) Campaign Sub-Score (10% weight) — Based on:

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.

Safe Cold Email Sending Limits After Warmup

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):

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.

Understanding Your Warmup Inbox Rate

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

Why Is My Spam Rate High When My Spam Folder Is Empty?

Your warmup Spam Rate measures where the mail your mailboxes SENT landed for the people receiving it - not what arrives in your own folders. Separately, when warmup mail does land in your spam folder we move it to your inbox automatically, so that folder stays close to empty by design. Either fact alone explains an empty spam folder alongside a high Spam Rate; together they mean checking your own folder can never confirm the number. The figure also records where each email landed FIRST, so mail we later rescued still counts. Explains how to check the rate properly (sample size, trend, sending authentication - especially whether your SPF lists the service you actually send through) and why a high spam rate automatically lowers that mailbox's daily volume until placement recovers.

Full explainer: /documentation/why-is-my-spam-rate-high-when-my-spam-folder-is-empty

Why Reconnecting Doesn't Fix This Mailbox

If a mailbox asks to be reconnected again within minutes of you reconnecting it, the sign-in is not the problem. Your email provider has switched off incoming access for that mailbox - the permission that lets an outside app read mail arriving in it. WarmySender can still send from the mailbox, so campaigns keep going out at the same limits; what stops is reading incoming mail, which is what warmup placement figures and stop-on-reply depend on. A new App Password cannot change it, because the refusal happens after a successful sign-in. Explains what you will see, why the reconnect loop happens, exactly what to ask whoever administers the email account to turn back on, and how the warning clears on its own afterwards without you reconnecting.

Full explainer: /documentation/why-reconnecting-does-not-fix-this-mailbox

Why Warmup Needs Incoming (IMAP) Access

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

What Warmup's Receiving States Mean

The reference page for every note warmup shows about the RECEIVING side of a mailbox, and how each one relates to your Success Rate.

'Not receiving warmup' is triggered by three days with no warmup email confirmed arriving in that mailbox's inbox, and it is cleared by one warmup email arriving — nothing else. There is no timer and no expiry, so it does not lapse on its own. It applies to one mailbox at a time.

'Incoming warmup paused' is different: we deliberately stopped sending warmup to that address because mail wasn't getting through, and it covers every mailbox on the domain at once.

'Cooling down' reduces how much a mailbox sends while its placement recovers — it does NOT stop the mailbox receiving.

Your Success Rate can't fall because nothing is arriving: it's a sending score, measuring where the warmup this mailbox sent landed for the people who received it. 'Success Rate' and 'Inbox Rate' are the same number under two labels.

Full explainer: /documentation/what-warmup-receiving-states-mean

The two-minute check for a quiet mailbox: /documentation/why-warmup-emails-are-not-arriving-in-my-inbox

Why Warmup Emails Aren't Arriving in My Inbox — and How to Fix It

Warmup is real inboxes exchanging real email, so an address has to be able to RECEIVE mail, not just send it. When warmup has been running for days and nothing has arrived, there are two common causes and both sit on your side.

Most common: the domain is not set up to accept email. A domain can send perfectly well through a sending service while having nowhere for incoming mail to land — the mail records (MX) that tell the internet where to deliver email for your domain are missing or point somewhere that isn't your mailbox. Nothing addressed to that domain can arrive: not warmup, and not replies from real prospects either. Check it in seconds with any free MX lookup tool, then add the records with whoever manages your domain's DNS.

Second: a filter or rule is moving warmup email out of the inbox — often a rule you created yourself to tidy warmup mail away. Warmup email has to land in the inbox to count, so a rule that archives, labels-and-skips-inbox, or deletes it will make a healthy mailbox look like it is receiving nothing.

Also possible: the address sends through a relay but has no real inbox behind it at all.

How to tell in two minutes: send that address an email from a personal account on a different provider. If it never turns up anywhere, the domain cannot receive mail. If it lands in the inbox within a couple of minutes, the receiving side is fine and you're looking at a filter or a passing quiet spell.

Full explainer with the step-by-step fix: /documentation/why-warmup-emails-are-not-arriving-in-my-inbox

Why Your Warmup Can Pause — and How It Resumes

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 Is My Mailbox's Warmup Score?

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

How Warmup Protects Your Deliverability

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

Set the Language of Your Warmup Emails

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

Why Is My Warmup Bounce Rate High?

A high-looking warmup bounce rate is usually just a small sample or a temporary receiver-side delay. Here's what it means and when to act.

Full explainer: /documentation/why-is-my-warmup-bounce-rate-high

Why Can't WarmySender Read My Inbox?

A work mailbox has two separate permissions: permission to SEND, and permission to READ what arrived. On Microsoft 365 and Google Workspace an administrator controls both and can allow one while blocking the other — they are two tick-boxes side by side, and only the sending one usually gets mentioned. When reading is switched off your mailbox keeps sending perfectly (warmup mail and campaign mail both go out), but we cannot see anything arrive, so your warmup results look empty even though the mailbox is completely healthy. The giveaway is a FLAT ZERO arriving day after day while your sending looks normal, plus a test email from an outside account landing in the mailbox's own webmail while WarmySender still shows nothing. Your sending was never affected and nothing was lost. The fix is one tick-box and takes about a minute: on Microsoft 365, admin.microsoft.com → Users → Active users → the person → Mail → Manage email apps → tick IMAP (and check Authenticated SMTP is ticked too) → Save; on Google Workspace, admin.google.com → Apps → Google Workspace → Gmail → End User IMAP/POP Access → turn IMAP on for the right organisational unit → Save. The full page has the several-mailboxes-at-once route and what to expect afterwards.

If you check and reading is ALREADY switched on: stop there and tell us. That permission is the most common reason we cannot open an inbox but it is not the only one — the connection to your provider can fail for reasons that have nothing to do with your account, and from the outside they all look the same. This note has appeared on Microsoft mailboxes whose settings were perfectly correct all along, so a setting that is already right is worth reporting rather than second-guessing. If the tick-box is already on, or you are on a personal mailbox where there is no administrator at all, email [email protected] with the mailbox address and that one sentence — and we will take it from there. Do not keep changing settings, re-enter your password or disconnect the mailbox: none of that can reach whatever is stopping the connection, and disconnecting discards your warmup history.

Full explainer: /documentation/why-we-cannot-read-your-inbox

Campaigns

Setting Up Your First Campaign

Your first campaign takes about twenty minutes to build: connect a mailbox, import a verified list, write a three-step sequence, leave the daily limit at its default, and launch. What takes longer is what happens before it — letting warmup establish the mailbox, and getting your domain's authentication records in place.

What is genuinely required:

Strongly recommended, but not enforced — and we say so plainly, because hunting for a gate that does not exist makes the product look broken:

The steps:

  1. Create the campaign — Campaigns > Create Campaign > Email Campaign. Name it something you will recognise in three months.
  2. Add prospects — CSV import, paste, add individually, or select an existing list. Start with 50-100 for your first run: enough that the reply rate means something, small enough that a mistake costs a hundred addresses rather than five thousand.
  3. Write a three-step sequence — an initial email, a follow-up after 3 days that adds something new rather than 'just bumping this', and a brief, genuinely final close after another 4 days. Use merge tags like {{firstName}}, {{company}} and {{role}}, plus any column you mapped on import, and always preview with real sample data: an empty merge tag is the most obvious tell that an email was automated. Thread follow-ups under step 1 to keep the conversation in one place. Leave branching conditions out of a first campaign.
  4. Configure sending — leave the daily limit at its default of 50 per mailbox. It is a ceiling, not a target, and raising it buys nothing on a young domain because the domain-wide ceiling binds first. Set your sending window in your prospects' time zone, weekdays only, and assign one mailbox. Emails are spread evenly across the window, so a campaign checked ten minutes after launch showing only a couple sent is the system working.
  5. Review and launch — preview every step, read the subject line as a stranger would, check the footer, and confirm the window and time zone. A campaign launched after today's window closed correctly starts tomorrow.
  6. Watch three numbers — bounce rate is the urgent one (a campaign auto-pauses if bounces cross the safety threshold; fix the list rather than resuming), reply rate is the honest signal of whether the message works, and open rate is directional only, because inbox privacy features inflate it across every tool. Spam complaints are reported to the recipient's mailbox provider and never to WarmySender, so track those in Google Postmaster Tools.

How much can you send? One canonical answer, week by week, by domain and mailbox age: /documentation/how-many-cold-emails-can-i-send-per-day

What is a good reply rate? Rather than a house number, see the sourced cold-email reply-rate figures — cross-industry average and top decile, each with primary citations — at /blog/email-deliverability-benchmarks

Scaling, in order: fix the message before adding volume; grow the list rather than the per-mailbox limit; add mailboxes once the domain has earned a higher ceiling; add a second sending domain when one is no longer enough, and warm it from scratch. Leave warmup running the whole time — it is not a setup step you complete and switch off.

Full step-by-step walkthrough: /documentation/first-campaign

Campaign Sequences: Delays & Conditions (YES/NO Branching)

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):

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:

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):

The shortcut — start from a proven preset:

A note on LinkedIn pacing and safety:

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).

Combine Multiple Conditions with AND / OR

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:

  1. Add a Condition step to your sequence.
  2. Set the first row — for example Email Opened, operator 'at least', number 2.
  3. Click '+ Add condition'. A joiner appears between the rows; set it to AND or OR.
  4. Set the second row — for example Link Clicked at 'at least 1 time', which simply means they clicked.
  5. 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:

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

Campaign Types: Email, LinkedIn & Multichannel

WarmySender supports three campaign types:

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:

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 ($12/month per seat). You can create campaigns from the Campaigns page using the 'Create Campaign' dropdown.

Creating a Multichannel Campaign

Multichannel campaigns let you combine email and LinkedIn outreach in a single sequence for maximum engagement.

Getting Started:

  1. Go to Campaigns Hub and click 'New Campaign', then select 'Multichannel' as the campaign type.
  2. 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:

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.

Campaign Sequences & Follow-ups

Campaigns support multi-step sequences with automated follow-ups:

Step Configuration:

Delay Settings:

Stop Conditions:

Best Practices:

Why launch shows "some prospects missing template data"

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:

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:

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 Email, LinkedIn, Instagram, and Multichannel sequences that combine them. 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 & Personalization

Merge tags let you personalize every email for each prospect automatically.

Built-in Tags:

LinkedIn-Specific Tags (in LinkedIn campaigns):

Sender Tags:

Opt-out Tag:

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. Five spellings all resolve to the same value, so a template pasted in from another tool keeps working: {{custom.department}}, {{custom_department}}, {{custom_fields.department}}, {{customFields.department}}, and the bare shorthand {{department}}. The {{custom.department}} form is recommended and is what the variable picker inserts.

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):

2) Short form with a double pipe (||):

More examples you can copy and paste:

Good to know about the short form:

Tags We Don't Recognise (and placeholders from other tools):
A tag that matches no built-in field and no custom field sends as EMPTY — it is never printed literally in your email. Before you launch, the pre-launch check lists every unrecognised tag by name so you can fix or remove it, and it also spots square-bracket placeholders carried over from other tools ([company], [first name], [[FirstName]]) and offers a one-click fix that converts each to the matching WarmySender tag. Square brackets are not merge tags here, so left alone they go out exactly as typed — always accept the fix or edit them yourself.

Best Practices:

Spintax — Dynamic Text Variations

Spintax lets you write several versions of a phrase in one place, so every recipient gets a slightly different message. That variety is what keeps your outreach from looking like one template sent a thousand times — it improves deliverability and helps you avoid spam filters.

Syntax:
Wrap your alternatives in curly braces, separated by pipes:
{Hello|Hi|Hey} — one option is picked at random each time the message is sent.

Works In:

In short: if you can type a message in WarmySender, spintax works in it.

Examples:
Subject: {Quick question|Reaching out|Short intro} about {{company}}
Email 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}.
LinkedIn invite note: {Hi|Hey} {{firstName}} — {loved your recent post|great to see your work} on {{company}}.
Instagram DM: {Hey|Hi} {{firstName}}, {quick question|one quick thing} for you.

Multiple spintax blocks multiply your variations:

The variation count is shown in the editor status bar so you can see your total unique combinations at a glance.

Nesting is supported:
You can put spintax inside spintax, to any depth, and every level resolves.
• {Hi {there|friend}|Hello} — 3 variations: 'Hi there', 'Hi friend', 'Hello'. (The first option itself has two versions, and 'Hello' is the third.)
• {Hope {you're|things are} {well|going great}|Hope your week is off to a good start} — 5 variations.
Count it by working outwards: each option counts as the number of versions it can produce, and you add the options of a block together.

LinkedIn invite notes:
LinkedIn limits an invite note to 300 characters. We count your LONGEST variation against that limit, so whichever version gets picked, it fits — you'll never have a note trimmed or refused because the random pick came out long. If your longest version is over the limit, we tell you before the campaign saves.

What if my braces don't match?
If a block is missing its closing brace (or has an extra one), we'll tell you which block to fix before the campaign saves — the message names the exact text, so nothing goes out with stray braces in it. This check runs everywhere a message is saved: the campaign editor, LinkedIn templates, and campaigns created by an AI agent or through the API.

Spintax vs Merge Tags:

Preview & Testing:

Processing Order:
1. Merge tags are resolved first ({{firstName}} → 'Scott')
2. Spintax is resolved second, inside-out, until no blocks remain ({Hi {there|friend}|Hello} → 'Hi friend')
3. Formatting and any channel length limits are applied last, to the finished text

FAQ — Why did a message go out with braces in it?
Honest answer: before September 2026, spintax only worked on email — LinkedIn, Instagram and WhatsApp messages sent the braces exactly as typed — and nested blocks weren't supported on email either, so the outer braces of a nested block went out literally. Both are fixed. Spintax now resolves on every channel and at any nesting depth. You don't need to re-save or rebuild anything: existing campaigns and templates pick it up automatically on their next send.

Best Practices:

A/B Testing & Auto-Optimization

A/B testing lets you compare different email variants to find what works best.

How It Works:

  1. When creating a campaign step, add multiple variants — each with its own subject line and body content.
  2. Each variant gets a weight that determines what percentage of prospects receive it (e.g., 50/50 split for two variants).
  3. As emails are sent, the system tracks open rates, click rates, and reply rates for each variant independently.
  4. 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:

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 Windows & Schedules

Control when your campaign emails are sent:

Sending Window — Set the start and end hours for email delivery:

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:

How Scheduling Works:

  1. When a prospect is ready for their next step, the system calculates the scheduled send time (step delay + random jitter)
  2. If the scheduled time falls outside your sending window or on an inactive day, it automatically advances to the next valid time
  3. The system scans up to 8 days ahead to find the next valid slot
  4. Random jitter (1-5 minutes) is added between individual sends to avoid pattern detection

Best Practices:

Sending Windows, Time Zones & Paced Sending

Two things about your cold email campaign are working exactly as intended, even though they sometimes surprise people.

  1. 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.
  1. 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.

How Sending Schedules & Pacing Work

Your cold email campaign decides WHEN each email goes out using three simple rules, all designed to keep you landing in the inbox.

  1. 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.
  1. 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.
  1. 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.

Campaign Says Running But Never Sends

If your campaign has shown Running for hours or days, has never sent a single email, and the 'next email' time keeps sliding forward, the most common cause is that EVERY STEP IN YOUR SEQUENCE IS SWITCHED OFF.

Why that stops everything: each step in your sequence has its own Enabled checkbox, so you can park a step without deleting the wording you worked on. A switched-off step is greyed out and marked with a Disabled badge. But if NO step is switched on, the campaign has an empty list to work through — there is no first email to send, so nobody is contacted, nothing is scheduled, and it keeps waiting while the status still reads Running. It isn't broken and your contacts aren't lost; it has simply been given nothing to do.

The fix (about a minute): open the campaign → Sequence tab → click your first step → tick the Enabled checkbox → repeat for any other steps you want → save. No need to stop and re-launch, rebuild the sequence, or re-import contacts. Everyone keeps their place and sending starts on the next cycle inside your sending window. Within a few minutes you should see a 'Next email ~time' indicator with a real upcoming time — that's your confirmation it's working.

We've since made this impossible to walk into silently: you can no longer launch a campaign with no steps switched on, a clear notice appears on a campaign in that state, you get a heads-up the moment you switch off your last remaining step, and the endless silent waiting is gone.

If your steps ARE switched on and it still isn't sending, your campaign is almost certainly waiting on purpose. The legitimate reasons, and how to tell them apart: (1) outside your sending hours or not a selected send day — the next-send time points at your next window open; (2) today's daily limit already reached — emails DID go out today and the count simply stopped climbing (versus switched-off steps, where it never started); (3) spacing between sends — the count is rising, just slowly, because Minutes Between Sends applies per mailbox; (4) no mailbox connected or selected on the campaign; (5) the Start Date is in the future because it was scheduled for later; (6) nobody eligible to email — an empty Prospects tab, everyone showing Suppressed, or contacts with no email address on them.

What a healthy campaign looks like: at least one step without a Disabled badge, a 'Next email ~time' indicator showing a real upcoming time (or 'First emails sending now…'), a sent count climbing gradually rather than all at once, and contacts moving through the steps on the Prospects tab.

If you only launched a few minutes ago, this probably isn't your page — a brief Running with 0 sent right after launch is normal paced sending. See 'Why is my campaign running but no emails sent yet?'

Full explainer with a worked example and FAQ: /documentation/campaign-says-running-but-never-sends-any-emails

Daily Sending Limits

WarmySender enforces multiple layers of sending limits to protect your deliverability:

Campaign-Level Limits:

Mailbox-Level Rate Limits:

Plan-Level Daily Limits:

Provider-Level Limits:

Domain-Level Limits:

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.

Sending Interval Between Emails (Per Mailbox, Not Global)

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.

Campaign Safety & Cooldown

WarmySender automatically protects your sender reputation with safety features:

Bounce Rate Protection:

Spam Complaints — What We Can and Cannot See:

Reply Rate Floor (optional):

Cooldown & Recovery:

Mailbox Auth Protection:

Pausing on a Struggling Email Provider:

Watchdog System:

Best Practices:

Why did my campaign pause for bounces?

Your campaign stopped because too many of the emails it sent came back undeliverable. A high bounce rate is the fastest way to lose your place in the inbox — and the damage follows your sending addresses rather than staying with one campaign — so we stop the campaign before that happens. Nothing is broken, nothing is lost, and your other campaigns are unaffected.

What you'll see: a status badge reading 'Cooldown' and a notice reading 'Paused — high bounce rate'. The workspace owner also gets an email naming the campaign, the bounce rate it reached and the limit it crossed.

What trips it — both must be true:

Worked example: 400 sent, 26 bounced. 26 ÷ 400 = 6.5%, which is above 5%, so it stops. The same list at 40 sent and 4 bounced is 10% — and nothing happens, because 40 is below the 50-send floor. That's why a campaign can run for a while, look fine, then stop: it finally sent enough email to be judged.

Why we don't resume it for you: a high bounce rate isn't a hiccup that passes with time — it's a statement about the contact list. Restarting on a timer would send more email to the same addresses, bounce at the same rate, stop again, and cost a little more sender reputation each round. The one thing that fixes it is a cleaner list.

How to fix it and resume:
1) See which addresses bounced — Inbox → Campaigns tab → Delivery Issues.
2) Run the rest through the built-in Email Verifier and remove everything that comes back Invalid. This is the step that actually moves the number.
3) Apply the cleaned list back to the campaign (this never re-sends to anyone already emailed), then click Resume.
You don't need to remove the bounced addresses yourself — every address that bounces for good goes on your Blocklist automatically and no campaign will try it again.

It won't stop again straight away: resuming takes a fresh baseline, so the bounce rate is measured only on what the campaign sends from that moment on. Paused at 400 sent / 26 bounced, then 200 more sends with 4 bounces, is measured at 4 ÷ 200 = 2% and keeps running — not 30 ÷ 600 = 5%. But resume without cleaning the list and it will stop again after about another 50 sends.

Want it to stop even earlier? Settings → Bounce Shield → 'Use my own, stricter limit' applies a lower number to every campaign in the workspace; a single campaign can also carry its own limit in the campaign editor. Where both exist we always use whichever is lower, so this can only ever tighten protection — setting it higher than a campaign's own limit changes nothing.

Can't be switched off: pausing on high bounces and blocking bounced addresses run on every campaign in every workspace. You can move the line in the stricter direction and choose whether we email you, but not turn the protection off.

Not triggers: unsubscribes never pause a campaign (a clean opt-out is a healthy outcome in cold email), and spam complaints never pause one either — your campaigns send from your own mailbox, so complaints go to that recipient's provider and no copy reaches us. Track those in Google Postmaster Tools or Microsoft SNDS, aiming under 0.1%.

Full explainer with the arithmetic worked through and a 12-question FAQ: warmysender.com/documentation/why-did-my-campaign-pause-for-bounces

Why were my emails rejected as spam before sending?

If your campaign paused with 'Paused — messages were rejected', some of your emails were turned away as spam before they reached anyone. This is not a bounce, and it is almost never a problem with your contact list — the people you were writing to are fine, and often they have already opened an earlier email in the same campaign. What was refused was the message.

Why it happens: many email hosts filter outgoing mail as well as incoming. If yours decides a message looks like promotional bulk mail, it refuses to send it. Nobody received it and no recipient's mail service was ever asked for an opinion.

How to tell it apart from a bad list:

The usual causes, most likely first: links (especially shortened ones or several in a short email); promo codes, discounts and 'limited time' wording; image-heavy or heavily designed HTML with little real text; a sending domain that is not set up to authorise your mail; and high volume on a shared mail host with a strict outgoing filter.

How to fix it: find the affected steps, write a link-free version of them, strip the design back to plain short text, send to twenty or thirty contacts to check, then click Resume. Add a link back on a later step only once the earlier ones are landing.

While the campaign is paused nobody is marked bounced, nobody is added to your blocklist, your other campaigns keep running and your bounce rate is unaffected.

Full explainer with the causes in order, a step-by-step test and when to contact your email host: warmysender.com/documentation/why-were-my-emails-rejected-as-spam-before-sending

Stop Emailing the Same Prospects Too Often

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):

  1. 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.
  1. 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.
  1. 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:

Full walkthrough with examples: warmysender.com/documentation/stop-emailing-the-same-prospects-too-often

Mailbox Rotation

Assign multiple mailboxes to a single campaign and WarmySender will automatically rotate between them:

Rotation Modes:

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):

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.

Email Tracking (Opens, Clicks, Replies)

WarmySender tracks all key email engagement metrics:

Open Tracking:

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:

Reply Tracking:

Bounce Detection:

Unsubscribe Handling:

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.

How to See Which Recipients Opened Your Emails

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):

  1. Go to Campaigns and click the campaign you want to check.
  2. Open the Prospects tab — this lists every recipient enrolled in the campaign.
  3. 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.
  4. 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.
  5. 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:

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.

See Opens and Clicks by Email Variant (A/B)

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):

  1. Open the campaign and go to the Sequence tab.
  2. A step with multiple variants shows a 'variants' badge. Click the step row to expand it.
  3. 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.
  4. The step's header row shows the combined totals across all variants.

Which variant each recipient received (Prospects tab):

  1. In the same campaign, open the Prospects tab.
  2. 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).
  3. 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:

See Which Email Templates Perform Best

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):

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:

  1. Save the copy you reuse as templates — only saved templates get their own performance row.
  2. Build campaigns from those templates rather than pasting fresh copy, so the results roll up where you can compare them.
  3. 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.

Your Campaign Draft Is Saved Automatically

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:

Good to know:

For the full walkthrough with a worked example, see the 'Your campaign draft is saved automatically' guide.

Why a Prospect Was Automatically Marked as Bounced

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:

  1. 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.
  2. 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.

See Emails That Didn't Get Delivered

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:

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'.

Importing large contact lists

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:

A few things to expect:

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.

Format Your Emails: Fonts, Sizes, Spacing and Colors

Everything is in the toolbar above the email body: Undo and Redo; a text style (Paragraph, Heading, Subheading, Quote); a font (Default = your recipient's own font, plus Arial, Helvetica, Georgia, Times New Roman, Verdana, Tahoma, Trebuchet MS, Courier New); a font size in nine steps from 11 to 24 px; line spacing (Compact, Normal, Relaxed); text colour and highlight; bold, italic, underline and strikethrough; bullet and numbered lists with decrease and increase indent; align left, center and right; link, image and divider; your variables; Insert signature; clear formatting; HTML code view; Send test; and Preview. Select any text and a small floating toolbar appears next to it with the controls you reach for most.

Shortcuts: Ctrl/Cmd+B bold, Ctrl/Cmd+I italic, Ctrl/Cmd+U underline, Ctrl/Cmd+K link, Ctrl/Cmd+Z undo and Ctrl/Cmd+Shift+Z redo. Enter starts a new paragraph (with a gap); Shift+Enter makes a line break inside the same paragraph (no gap) — that is the one to use inside a signature. Line spacing is a third, separate thing: it controls the air between lines WITHIN a paragraph, not the gap between paragraphs.

Pasting from Word, Google Docs or Gmail keeps basic formatting and drops the hidden clutter. If a paste comes in heavier than you wanted, select all and click Clear formatting.

When NOT to format: a status hint under the editor reads either 'Plain look' or 'Styled'. Inbox providers sort partly on appearance — a chosen font, coloured text and images look like a newsletter, and newsletters go to the Promotions tab. A message in the recipient's own default font with a couple of plain paragraphs looks like something a colleague typed, and that is the mail people reply to. For a first cold email aim for Plain look. Every campaign email also carries an automatic plain-text version derived from your formatting, which helps inbox placement; there is nothing to turn on.

Advanced: paste a full custom HTML layout (tables, a designer's template) into HTML code view — it is preserved exactly as written, and an email containing a layout like that reopens in code view. The formatting buttons are switched off while you are in code view because they would be acting on a document you cannot see.

Signatures use a trimmed-down version of the same editor (font, size, colour, bold/italic/underline, alignment, link, image) under Mailboxes > the mailbox's settings > Signature. Insert one with the Insert signature button or the {{signature}} variable.

Replies you send from the Unified Inbox use the same editor too, in a compact form: bold, italic and underline, links, bullet and numbered lists, font, size, text colour, clear formatting and HTML code view. There are no variables in a reply — you are writing to one named person, so anything in {{curly braces}} is sent exactly as you typed it. Your signature and Cc work as before, and every reply still carries a plain-text version automatically.

Your AI agent (Claude, ChatGPT, Cursor, Codex, OpenClaw, Hermes Agent, or any agent that speaks MCP) can write and format the same emails in plain language, and can list your saved templates and build a campaign step from one. An agent never sends a message itself and can never raise a limit — the scheduler paces every email inside your safe caps and gradual ramp no matter who set it up.

Full guide with worked examples and FAQ: /documentation/format-your-emails

Images in Campaign Emails

WarmySender supports inserting images into your campaign emails using the Image button in the email editor toolbar — the same toolbar that carries the font, text size, line spacing, colour, list, indent, link and divider controls. Full formatting guide: /documentation/format-your-emails

How to Insert an Image:
1. In the campaign email editor, click the Image 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:

Deliverability Considerations:

Common Use Cases:

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.

Email Attachments: Replies Yes, Campaigns No

There are two answers here, and the difference matters:

Why campaign emails don't take attachments:

What to do instead in a cold email:

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.

Attach Files to a Reply in Your Inbox

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:

The limits:

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

Email Signatures per Mailbox

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. You now edit it with the same visual editor you use for email bodies, in a compact form — pick a font, size, colour, add a link or a list — instead of typing raw markup. Signatures still support plain text and HTML. Formatting guide: /documentation/format-your-emails

Using {{signature}} in Campaign Emails:
In the campaign editor, click the Insert signature button in the toolbar, or insert the {{signature}} variable from the variable picker (or type it manually) — both do the same thing. 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:

Putting Your Opt-out in Your Signature:
You can also drop {{opt_out}} into a signature (or straight into the email body). It renders as your workspace's opt-out sentence — written by you in Settings > Account, in whichever style you chose — so the opt-out reads as part of your sign-off rather than as a separate footer. When you use it, the line appended at the bottom of the email carries only your company address. Leave it out and the full opt-out line is appended as usual, so an email can never go out without one. Example signature:

Best,
Sarah Whitfield
Acme Ltd

{{opt_out}}

Note: Signatures are not automatically appended — you must include {{signature}} in your email template body where you want the signature to appear.

Email Copywriting for Cold Outreach

Write cold emails that get opened, read, and replied to.

Subject Lines (Most Important):

Opening Line:

Body Structure:

Call to Action (CTA):

Follow-up Emails:

Common Mistakes:

Campaign Audience Segmentation

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:

By Industry:

By Company Size:

By Intent Signal:

Implementation in WarmySender:

  1. Create separate prospect lists per segment (e.g., 'SaaS CTOs', 'E-commerce VPs').
  2. Create separate campaigns per segment with tailored messaging.
  3. Use custom fields during CSV import to tag segments (custom:segment, custom:persona).
  4. Use merge tags to personalize within segments.

Best Practices:

Re-engagement Campaigns

Revive cold prospects who did not respond to your initial campaign.

When to Re-engage:

Re-engagement Strategy:

  1. Filter your prospect list to contacts who were 'contacted' but never 'replied'.
  2. Create a NEW campaign (do not re-enroll in the old one).
  3. Use a fresh angle — different subject line, different value proposition.
  4. Reference the previous outreach: 'I reached out a few weeks ago about...' (honesty works).
  5. 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:

Sending Pre-Written Personalized Emails (Everything as a Variable)

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:

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}}

Five spellings all work and mean the same thing: {{custom.field_name}}, {{custom_field_name}}, {{custom_fields.field_name}}, {{customFields.field_name}}, and the bare {{field_name}} (the last as long as the name does not conflict with a built-in field). A tag we don't recognise sends as empty rather than as literal text, and every unrecognised tag is listed by name in the pre-launch check before you launch — as are [square-bracket] placeholders pasted in from other tools, each with a one-click fix.

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:

Common Mistakes to Avoid:

Managing Campaigns via API

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:

  1. Create a campaign (POST /api/v1/campaigns) — always created in draft status
  2. Review and adjust settings (PATCH /api/v1/campaigns/:id)
  3. Enroll prospects (POST /api/v1/campaigns/:id/enrollments) — accepts prospectIds, listIds, or emails
  4. Start the campaign (POST /api/v1/campaigns/:id/start)
  5. Monitor progress (GET /api/v1/campaigns/:id)
  6. Pause if needed (POST /api/v1/campaigns/:id/pause)
  7. 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:

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

Campaign API Error Handling

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:

Campaign Failed Prospects & Processing Errors

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.

  1. 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.
  1. Mailbox temporarily disconnected — If your mailbox has intermittent connection issues during the processing window.
  1. 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.

Campaign Overview Metrics (All-Time Totals)

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.

Send Pace Across Multiple Campaigns (Per-Mailbox Pacer)

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.

Why Aren't My LinkedIn-Imported Leads Getting Emails?

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.

Safe Cold-Email Volume After Warmup

How much cold email to send per day per mailbox once it's warmed up: 30–50 a day, and 50 is the default. That's our recommendation, not a limit — the limits that are applied sit on your domain (200 a day across every mailbox on a brand-new domain, warmup included, until it's 30 days old with 200 sends behind it, then 2,000). No mailbox provider publishes a per-mailbox daily cold-email limit, so any per-provider table is guesswork; what Google, Microsoft and Yahoo do publish is authentication and complaint-rate rules, cited on the page. Also covers keeping warmup running alongside cold sending (leave it on; maintenance settles around 30 a day by itself, and warmup shares one budget with your campaigns), the six weeks of sending days a new domain takes to reach full warmup speed, the tag and auto-tidy on warmup mail in your inbox, and the automatic slowdown once about 5% of a mailbox's warmup mail lands in spam — judged per mailbox, not per domain.

The canonical week-by-week table: /documentation/how-many-cold-emails-can-i-send-per-day

Full explainer: /documentation/safe-daily-cold-email-volume-after-warmup

Why Was This Prospect Skipped — Bounce

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

Why Do I Only See Some Replies in My Inbox?

The WarmySender inbox is a campaign-reply surface, not a second copy of your mailbox: it shows the conversations your campaigns started and the answers they earned. Warm-up emails, delivery-failure reports and mail from people who are not in your campaigns are never copied in — they stay in your own mailbox. The Sync summary breaks down everything it checked, so a line like "Checked 365 emails: 300 already in your inbox, 24 warmup emails, 2 delivery reports, 39 from people who are not in your campaigns" is a complete account of all 365, not 39 lost replies. Bounces surface under the campaign's delivery issues view and on the prospect's status instead of opening a conversation. A reply that arrives from a colleague's or a shared inbox's address is shown in the thread and marked unread, but it does not stop that prospect's sequence on its own — you stop it yourself from the inbox or the campaign's Prospects tab.

Full explainer: /documentation/why-do-i-only-see-some-replies-in-my-inbox

Why Follow-Ups Stay in the Same Thread and Inbox

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

Why Are My Campaign Emails Being Rejected?

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

How to add UTM tracking to cold email campaigns

UTM tracking adds a short label to the end of every link in a campaign's emails, so the visits those emails produce show up in your website analytics as their own clearly-named source instead of anonymous traffic. You switch it on per campaign, fill in a few boxes once, and every link in every email of that campaign is tagged for you from then on.

What a UTM tag actually is:

A UTM tag is nothing more than a little extra text on the end of a web address. If your email links to https://acme.com/pricing, the tagged version looks like this:

https://acme.com/pricing?utm_source=warmysender&utm_medium=email&utm_campaign=q3-agencies

The page your prospect lands on is exactly the same. Your website ignores the extra text; your analytics tool reads it. Google Analytics and virtually every other analytics tool recognise these names, so instead of that visitor being filed under 'Direct' with no explanation, you can see they arrived from your q3-agencies cold email campaign — and follow them through to a signup, a booked call or a sale.

Why tag centrally instead of by hand:

You can always paste a tagged link into an email yourself, and plenty of people start that way. It stops scaling quickly:

Tagging centrally means you describe the campaign once. Every link the campaign sends — including links you add to a step later, and links inside follow-ups — carries the same tags, spelled the same way.

Where to find it:

Open the campaign, go to Sending Settings, and scroll to the Tracking section. Under 'Track opens' and 'Track link clicks' you will see 'UTM tracking'. Switch it on and the fields appear.

The fields, and what to put in them:

Only Source, Medium and Campaign matter for most campaigns. Anything you leave empty is simply left off the links — nothing is invented for you, with the single exception of the campaign name filling in a blank Campaign box.

Step by step:

  1. Open the campaign you want to tag and go to Sending Settings.
  2. Scroll to the Tracking section.
  3. Switch 'UTM tracking' on. It is off by default on every campaign, so nothing changes anywhere until you do this.
  4. Fill in Source and Medium — for example warmysender and email.
  5. Leave Campaign blank to use the campaign's own name, or type the name you would rather see in your reports.
  6. Open 'Advanced' and add Term or Content only if you have a real use for them.
  7. Save. Every email the campaign sends from that moment on carries the tags.

Worked example:

Campaign name: Q3 Outbound — Agencies. In the Tracking section you set Source to warmysender, Medium to email, leave Campaign blank, and under Advanced set Content to step-1.

A link in your first email written as https://acme.com/pricing goes out as:
https://acme.com/pricing?utm_source=warmysender&utm_medium=email&utm_campaign=q3-outbound-agencies&utm_content=step-1

The prospect clicks it, lands on your pricing page as normal, and your analytics records the visit under warmysender / email, campaign q3-outbound-agencies.

Links you tagged yourself are never overwritten:

This is the rule worth remembering. If a link in your email already carries a tag of its own, that tag stays exactly as you wrote it. Say one link in the sequence points at https://acme.com/demo?utm_campaign=webinar-followup because you deliberately want those clicks reported under a different campaign — that link keeps utm_campaign=webinar-followup, and only the tags it was missing (source, medium) are filled in. Your deliberate choice always wins over the campaign-wide default, so switching this feature on can never quietly rewrite attribution you set up on purpose.

It works whether or not click tracking is on:

UTM tagging and 'Track link clicks' are two independent switches that do different jobs. Click tracking tells YOU, inside WarmySender, that a prospect clicked. UTM tags tell YOUR analytics tool where a visitor came from. You can run either, both, or neither.
• Both on: the click is recorded in WarmySender and the prospect arrives at the tagged address, so it shows up in your analytics too.
• UTM tagging on, click tracking off: links go straight to your site, untouched apart from the tags. Your analytics still sees the campaign; WarmySender simply does not count the click.

What does not get tagged:

Only ordinary web links (http and https) are tagged. Your unsubscribe link is deliberately left alone, and so are email addresses, phone numbers and in-email jump links. Nothing you have to think about — it just means your opt-out link never picks up marketing tags.

Use plain, fixed text — not merge tags:

The values here describe the campaign, not the person, so personalisation tags like {{firstName}} do not belong in them and will not be filled in. A value containing one is left off the links entirely rather than sent out with the raw text showing. There is a good reason beyond tidiness: a per-person value would create thousands of one-off entries in your analytics reports and make the campaign impossible to total up — which is the opposite of what UTMs are for. Keep values short, plain and the same for the whole campaign.

How to read the results in Google Analytics 4:

  1. Go to Reports > Acquisition > Traffic acquisition.
  2. Change the dimension dropdown at the top of the table from 'Session default channel group' to 'Session source / medium'. Your campaign traffic appears as a row reading warmysender / email.
  3. For the per-campaign breakdown, switch that dropdown to 'Session campaign' — you will see q3-outbound-agencies and any other campaigns you have tagged.
  4. To go further, use Explore > Blank (Free form): add Session source, Session medium and Session campaign as rows, and Sessions plus your key events (signups, purchases) as values. That gives you a single table showing how many people each campaign brought and how many of them converted.

A quick way to check it is working: switch tagging on, send yourself a test email from that campaign, click a link in it, then open Reports > Realtime in GA4. Your own visit should appear against the source you configured within a minute or so. Ordinary reports are not instant — allow up to a day before judging the numbers.

Naming conventions worth adopting on day one:

Good to know:

Frequently asked questions:

Do I need click tracking switched on for UTM tagging to work?
No. They are independent. UTM tags are added whether 'Track link clicks' is on or off — with it off, links go straight to your site and still carry their tags.

What happens if I leave the Campaign box blank?
WarmySender uses the campaign's own name, tidied into a web-safe form (lowercase, spaces and punctuation turned into hyphens). 'Q3 Outbound — Agencies' becomes q3-outbound-agencies. Type your own value any time you want the reporting name to differ.

Will this overwrite tags I already put on a link myself?
Never. A tag you wrote on a specific link is kept exactly as-is, and only the tags that link was missing are added.

Can I use {{firstName}} or other personalisation tags in the values?
No. These values describe the campaign rather than the person, so a value containing a personalisation tag is left off the links rather than sent out raw. Per-person values would also fragment your analytics into thousands of unusable one-off entries.

Does switching it on change my past emails or past analytics?
No. Only emails sent after you save are tagged, and your existing reports stay exactly as they are.

Is my unsubscribe link tagged too?
No. Unsubscribe links are deliberately left alone, as are email addresses and phone numbers in your message. Only ordinary web links are tagged.

Where do I actually see the results?
In your own analytics tool, not in WarmySender. In Google Analytics 4: Reports > Acquisition > Traffic acquisition, then switch the dimension dropdown to 'Session source / medium' or 'Session campaign'.

Do I have to set this up on every campaign?
Yes — it is a per-campaign setting, which is the point: it is how each campaign gets its own name in your reports. Duplicating a campaign carries the settings over, which is the quickest way to reuse a setup you like.

Will UTM tags hurt my deliverability?
UTM parameters are standard on marketing links across the whole internet and are not a spam signal in themselves. Keep the values short and plain, as you would anywhere else.

What if I only fill in some of the fields?
Only what you filled in is added. Empty fields are simply left off — nothing is guessed on your behalf, apart from a blank Campaign box falling back to the campaign name.

Related reading: see who opened and clicked at /documentation/see-who-opened-your-emails, and personalisation tags for your message text (a different thing entirely) at /documentation/merge-tags.

Still stuck? Contact us at [email protected] with the campaign name. 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 — for example: 'In WarmySender, how do I make one campaign's clicks show up under their own campaign name in Google Analytics, without changing links I already tagged myself?'

How stop-on-reply works across channels

One real reply on any channel stops every remaining step of that prospect's sequence on every channel. Answer a cold email and the pending LinkedIn message, Instagram DM and WhatsApp message stand down too — and it works in every direction. An automatic reply (a holiday autoresponder, a ticket acknowledgement, a 'no longer monitored' notice) does not stop anything and never counts toward your reply rate; it is filed as an automatic reply rather than deleted, so your history stays complete. A reaction is not a message, so it is not a reply. If a sequence stopped by mistake, use 'Resume sequence' on the campaign's Prospects tab or relabel the thread as Auto-Reply / Out of Office in the inbox — the prospect rejoins at the next step they have not already received, nothing is ever re-sent, and nothing goes out immediately. Full detail at /documentation/how-stop-on-reply-works-across-channels.

How WarmySender handles automatic replies and out-of-office messages

Not every message that lands back in your inbox is a person answering you. Mail servers answer too — an out-of-office notice, a "thanks, we've received your enquiry" acknowledgement from a help desk, a "this address is no longer monitored" notice, or a bot that files your email as a support ticket. WarmySender recognises these and treats them differently from a real reply, so a robot on holiday duty never ends a sequence you meant to keep running, and never flatters your reply rate.

The short version:

What counts as an automatic reply:
We look at the whole message, not just the words in it. That includes the hidden markers most mail systems attach to auto-responders, the shape of the subject line, and the wording of the message itself. Common examples we recognise:
• Out-of-office and holiday notices — "I am currently out of the office until 14 March", "Ik ben afwezig", "Ich bin nicht im Büro", "Je suis absent", "Estoy fuera de la oficina".
• Ticket acknowledgements — "Thank you for contacting us, your request has been received. Ticket #48120."
• Automatic confirmations — "This is an automated response, please do not reply to this message."
• Delegation notices — "I have left the company, please contact Sarah instead."
• Vacation autoresponders in several languages, including English, Dutch, German, French and Spanish.

Why this matters more than it sounds:
If a holiday notice were treated as a reply, three things would go wrong at once. Your sequence would stop for someone who never read your email. Your reply rate would look better than it is, so you would draw the wrong conclusion about your copy. And the person would come back from leave to nothing — the follow-up that would have caught them was cancelled while they were away. Handling auto-replies properly is really about not losing the lead.

What happens to a genuine reply:
When a real person writes back, the campaign does what you told it to do. If 'Stop on reply' is on — it is on by default, and it is what most people want — that person stops receiving follow-ups the moment their answer arrives, and the conversation moves to your inbox. Their reply is counted in your reply rate, and it is credited to the email they actually replied to, so you can see which step in the sequence earns the answers.

If you switch 'Stop on reply' off, the sequence carries on regardless. That is occasionally useful for purely informational sends, but for outreach it is almost always the wrong choice — nobody enjoys receiving follow-up number three after they have already answered.

If a sequence stops when it shouldn't have:
Detection is very good but it is not perfect. Someone's company may use unusual wording, or a language we do not yet cover, or a human-sounding message written by a bot. If a sequence stops for a person who never really answered, here is how to put it right.

Option 1 — Resume from the campaign:

  1. Open the campaign and go to the Prospects tab.
  2. Find the person. Their status will show that they replied.
  3. Click the actions menu on their row and choose 'Resume sequence'.
  4. Confirm.

They go straight back into the sequence at the next step they have not received yet. Nothing is sent immediately — the next email goes out at your normal pace, in your normal sending window.

Option 2 — Relabel the message in your inbox:

  1. Open your Inbox and click the message.
  2. Change its label to 'Auto-Reply / Out of Office'.
  3. Save.

The person's sequence picks up again on its own, and the message stops counting towards your reply rate. This option is worth preferring when you have several similar messages to correct, because relabelling also teaches you which phrasings to watch for.

The one thing people worry about — answered:
Resuming never re-sends an email somebody already received. The sequence remembers exactly which steps went out to which person, and continues from the one after. Your first email cannot be sent twice, no matter how many times a prospect is stopped and resumed.

What you will see in your numbers:

Good habits:

Frequently asked questions:

Does an out-of-office reply use up one of my follow-ups?
No. The sequence is not advanced or stopped by it. Your follow-ups go out exactly as scheduled.

Will an out-of-office message inflate my reply rate?
No. It is excluded from reply statistics.

Someone's assistant replied on their behalf. Is that automatic or genuine?
That is a genuine reply — a person wrote it — so the sequence stops. If you would rather keep emailing the original address, resume the sequence from the campaign's Prospects tab.

A ticket system replied and my sequence stopped anyway. What do I do?
Resume the sequence from the campaign's Prospects tab, or relabel the message as 'Auto-Reply / Out of Office' in your Inbox. Either works; both continue from the next unsent step.

If I resume someone, will they get the first email again?
No. Emails already sent to that person are never sent again.

Does resuming send an email straight away?
No. The next step is scheduled at your normal pace, inside your normal sending hours.

Which languages are covered?
English, Dutch, German, French and Spanish are covered explicitly, and the hidden markers that mail systems attach to auto-responders are recognised regardless of language.

Can I switch this off?
There is nothing to switch off — an automatic reply is never a reply, in the same way a delivery receipt is not a reply. What you do control is 'Stop on reply', which decides what a genuine reply does.

Related reading: how out-of-office notices are detected at /documentation/out-of-office-handling, and what your campaign statistics mean at /documentation/analytics.

Still stuck? Contact us at [email protected] with the campaign name and the address involved. 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 — for example: 'In WarmySender, an out-of-office message stopped my sequence for one prospect. How do I put them back into the campaign without re-sending the first email?'

How Many Cold Emails Can I Send Per Day?

Once a mailbox is warmed up, send 30-50 cold emails per day from it — 50 is the default WarmySender sets, and it is the number to grow into, not to start at. A brand-new sending domain is held to 200 emails per day in total across every mailbox on it, warmup included, until it is at least 30 days old with 200 emails behind it and no spam complaints; after that the ceiling lifts to 2,000 a day. Warmup itself starts at one email a day and reaches full speed around your sixth week of sending. When you need more volume, add mailboxes — never push a single mailbox higher.

If you have read a different number elsewhere — "200+ a day", "start at 5 and double every week" — this is the page that is right.

Week by week, for one mailbox on a new domain. "Week" means a week of sending days, not calendar days: warmup only advances on days the mailbox actually sends.
• Week 1 (sending days 1-7): warmup 1 rising to 7 a day. No cold emails yet — let warmup establish the mailbox. Whole domain capped at 200 a day.
• Week 2 (days 8-14): warmup 9 rising to 15 a day. Still no cold emails. Domain capped at 200 a day.
• Week 3 (days 15-21): warmup 15 rising to 21 a day. Cold: up to about 10 a day. Domain capped at 200 a day.
• Weeks 4-5 (days 22-35): warmup 23 rising to 35 a day. Cold: about 15, then about 25 a day. Domain capped at 200 until it turns 30 days old, then 2,000.
• Week 6 onward (day 36+): warmup 40 a day — full speed for a new domain. Cold: 30-50 a day, the steady state, and 50 is the default. Domain ceiling 2,000 once it qualifies.
• After six months and 10,000 sends: warmup 40 a day, or up to 120 if the mailbox has earned it. Cold still 30-50 per mailbox — add mailboxes for more volume. Domain ceiling 10,000 a day, on request and by review.

Read the two columns differently. The domain ceiling is a hard limit the platform applies — go over it and sending simply waits. The cold-email figures are our recommendation, and the platform does not stop you exceeding them: your per-mailbox daily limit is yours to set anywhere from 1 to 500. Nothing in the product forces you to warm up before you send cold, so the discipline has to come from you.

Four separate ceilings apply, and the lowest one wins on any given day:

The practical consequence: on a new domain, ten mailboxes do not give you ten times the volume. They give you the same 200 a day, split ten ways. Mailboxes multiply your capacity only once the domain itself has earned a higher ceiling.

To send more, add mailboxes and then domains — in that order, never by raising one mailbox's limit. A single mailbox sending 200 a day is a far riskier signal than four mailboxes sending 50 each. Add mailboxes once the domain has passed 30 days and 200 sends; add a second sending domain when you need more than 2,000, and warm it from scratch because the six-week clock starts again.

What the mailbox providers actually require: every sender at any volume needs valid authentication on the sending domain, a matching reverse lookup, properly formed messages, and a spam-complaint rate under 0.3%. Google asks senders to stay below 0.1% and never reach 0.3%, and applies extra bulk-sender requirements above 5,000 messages a day to personal Gmail addresses (mail to Google Workspace business addresses does not count toward that). Microsoft applies the same 5,000-a-day threshold to its consumer inboxes, asks for no more than about 30 messages a minute from one mailbox, and reduces quotas for accounts under two months old. Yahoo publishes no volume threshold at all and asks only that the spam rate stay below 0.3%.

None of them publishes a day-by-day ramp schedule, and none requires a warmup period or a health score before your first campaign. Anyone showing you a "day 1: 5 emails, day 2: 8 emails" table sourced to Google is showing you something Google never published — and Google specifically warns against suddenly doubling the volume you previously sent, so "double every week" is the one shape to avoid.

Full table and the provider detail: /documentation/how-many-cold-emails-can-i-send-per-day

LinkedIn

LinkedIn Outreach Overview

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 20+ 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.

What Happens to My Campaigns When I Reconnect LinkedIn?

Your campaigns come with you. When you reconnect your LinkedIn account - whether you enter your details again, sign in a second time after a security check or a verification code, or connect the same LinkedIn profile again - your existing campaigns follow the new connection automatically. There is nothing to rebuild, no list to re-import and nobody to add back. Your prospects keep their exact place in the sequence, so nobody is messaged twice.

Your daily and weekly sending allowance carries over exactly as it stood, which means reconnecting is never a way to send more today.

Campaigns pick back up on their own: one that was running keeps running, and one we had paused because the account had gone away starts again by itself. A campaign you paused yourself stays paused - a reconnect never overrides your own choice.

If a campaign says it needs relinking, open LinkedIn > Accounts, reconnect the account, and the campaign attaches itself within a few minutes.

Full explainer: /documentation/what-happens-to-my-campaigns-when-i-reconnect-linkedin

Why Did My LinkedIn Invites Pause Today?

Nothing is broken and there is nothing to re-launch. LinkedIn enforces its own invitation limits, and when it signals that an account has reached one, we pause sending on that account so it can rest. Sending resumes automatically.

Why we rest the account rather than retry: every further attempt during the rest period counts against the account and extends the rest — and a restricted or banned LinkedIn account cannot be recovered. Account safety wins over speed, every time.

Why a week can total far fewer invitations than the number you configured — five things compound: (1) LinkedIn's own weekly ceiling on the account, which no setting here can raise; (2) that ceiling depends on the LinkedIn plan the account is on (Free vs Premium / Sales Navigator) — you can tell us which plan an account is on under LinkedIn > Accounts to unlock the higher ceiling, though declaring a plan you don't actually have won't help, because LinkedIn still enforces the real one; (3) a new account eases in gradually over several weeks rather than starting at the ceiling; (4) several campaigns on ONE LinkedIn account share ONE daily allowance — two campaigns set to 75 a day do not produce 150 a day, and adding another LinkedIn account is the only way to genuinely add capacity; (5) any days spent resting come straight off the week's total. Invitations sent also aren't the same as connections made, since only a share get accepted.

What not to do: don't pause and re-launch your campaigns, don't disconnect and reconnect the LinkedIn account, and don't create duplicate campaigns to work around the limit — none of those help, and some make the account less safe.

Full explainer with the arithmetic worked through: /documentation/why-did-my-linkedin-invites-pause-today

Why Did My Prospect Get the Same LinkedIn Message Twice?

Why one person in a LinkedIn campaign could receive the identical follow-up more than once, what stops it now, and what to say to them. The cause: a sequence step could deliver its message and then fail to record that it had done so, and a step with no record of having run looks, to the next pass, like a step that still needs to run — so it ran again. It was not your settings, not a duplicate in your list, and not your LinkedIn account — and it was not "Stop on Reply" being off, which is a different protection entirely. Fixed: every message is recorded the moment it is delivered, a second send of the same step to the same person can no longer be recorded at all, a retry that finds a delivery already recorded moves on instead of repeating, and a step that keeps failing stops and is flagged rather than looping. Your account's safe daily pace was never exceeded and has not been widened. Includes what to say to the prospect who received the repeats, where to find and change Stop on Reply, and how to tell a genuine repeat from the same person imported twice.

Full explainer: /documentation/why-did-my-prospect-get-the-same-linkedin-message-twice

Message Your Existing Connections (No Connection Requests)

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:

  1. Open the campaign builder — Go to LinkedIn > Campaigns, click 'Create New Campaign', and choose 'Start from scratch'.
  1. Basics — Name the campaign and choose the LinkedIn account (or accounts) you want to send from.
  1. 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.
  1. 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.
  1. 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.

See When Your LinkedIn Messages Are Delivered & Read

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

Send Attachments & Voice Notes in LinkedIn Messages

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

Attach Files to Your LinkedIn Campaign 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

React to, Edit, and Delete LinkedIn 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

Mute Conversations & Mark Them Unread

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

Accept or Decline Connection Requests From Your Inbox

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

Enrich a Prospect From LinkedIn

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

Publish or Schedule LinkedIn Posts

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

Post Job Openings & Review Applicants

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

Check InMail Credits & Edit Your LinkedIn Profile

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

LinkedIn Account Connection & Setup

Detailed guide for connecting your LinkedIn account:

Prerequisites:

Connection Steps:

  1. Go to LinkedIn > Accounts and click 'Connect Account'
  2. Choose your connection method — cookie-based (recommended, safest) or credentials
  3. Enter your LinkedIn login details
  4. If 2FA is enabled: you'll be prompted for a verification code. Enter it within 10 minutes.
  5. Wait for the connection to complete — your account will show 'Connected' status

Account Types Detected:

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.

Why am I getting reconnect emails from WarmySender?

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:

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):

  1. Click the Reconnect button inside any of the reminder emails, or open WarmySender and go to the LinkedIn accounts page.
  2. 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.
  3. The account flips back to connected within seconds. Campaigns resume on their normal schedule.

Your campaign data is preserved:

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/why-is-my-linkedin-account-disconnected (deep dive on session rotation), /documentation/why-is-my-linkedin-account-disconnected (status pill semantics).

LinkedIn Conversations & Messages

Manage all LinkedIn conversations from LinkedIn > Conversations:

Conversation List:

Message Thread:

Replying:

Campaign Integration:

The Unified Inbox also has a LinkedIn tab showing all LinkedIn conversations alongside your email replies for a complete view of all prospect interactions.

LinkedIn Safety Limits & Protection

WarmySender protects your LinkedIn account with multiple layers of safety:

Rate Limiting:

Account-Type Limits (weekly invites / daily messages hard cap):

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):

Safety Mechanisms:

Account Restriction Handling:

How campaigns share one LinkedIn account's daily limit

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.

Why is my LinkedIn campaign sending slowly?

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.

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:

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-sending-limits-and-account-tiers.

LinkedIn seat billing: how add and remove work

WarmySender's LinkedIn add-on is billed per seat, and you choose how often you pay for it: monthly, yearly, or every 3 years. Each seat allows one connected LinkedIn account.

Choosing how you pay for LinkedIn seats

You pick the LinkedIn add-on's billing term yourself on the Billing page, when you buy. It's a separate choice from your plan and from your other add-ons — your Instagram seats can sit on a different term to your LinkedIn seats, and either can differ from your plan.

Worked example — 2 seats. On monthly you pay two lots of $12/seat/month, which is $24 a month, every month. On yearly you pay two lots of $120/seat/year once, and nothing again until the same date next year. The longer the term, the lower the rate per seat — and the rate you start on is the rate those seats keep (see grandfathering, below).

Why you can't choose a term longer than your plan's

Your add-on term can match your plan's term, or be shorter — never longer.
• On a monthly plan, add-on seats are billed monthly.
• On a yearly plan, you can pay for seats monthly or yearly.
• On a 3-year plan, you can pay for seats monthly, yearly, or every 3 years.

That's a guard rail, and it's there to protect you rather than to limit you. A seat only does anything while your plan is active: if the plan ends, connected LinkedIn accounts are set aside and campaigns pause. So seats prepaid for three years against a plan you can stop next month could sit paid-up long after there's a plan to use them with — and we'd rather not sell you that. If you want the longer commitment (and the lower rate) on your seats, move your plan to that term first on the Billing page; the longer add-on options open up straight away.

One renewal date, or two

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 $12/seat/month and $120/seat/year (17% 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 $12 — this means a single invoice can show a mix of rates, which is intended. The same protection covers billing terms: seats you already have keep the term AND the rate you bought them on, and choosing a different term for a new purchase never moves them.

Changing the term on seats you already have

Picking a term applies to the seats you're buying at that moment. Seats you already own keep the term they are on until you decide to change it.

Want to move seats you already own onto a different term? You can do that yourself. Open the Billing page, find your LinkedIn seats card, and pick the term you want. You can switch the term and add more seats in the same step, and it goes through as a single charge. The unused time on your current seats is credited against the new charge, so you never pay twice for the same days. Step by step: /documentation/how-do-i-switch-my-linkedin-seats-to-annual-billing

The one thing that does move your seats for you: if you change your PLAN's billing term, any seats billed together with your plan move to the new term with it, so your subscription stays on one term and one renewal date.

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 worked out automatically 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 ($12/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:

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:

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 check the resulting invoice's 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: Can I pay for LinkedIn seats yearly while my plan is billed monthly?
A: Not directly — an add-on can't be committed for longer than the plan it runs on, because a seat only works while the plan is active. Switch your plan to yearly on the Billing page first and the yearly seat option appears immediately (the same applies to the 3-year option, which needs a 3-year plan).

Q: My plan is yearly. Can I still pay for LinkedIn seats monthly?
A: Yes. A shorter term than your plan is always allowed. Your seats become their own subscription with their own renewal date, so you'll have two renewal dates instead of one — everything else works identically.

Q: Do my LinkedIn and Instagram seats have to be on the same billing term?
A: No. Each add-on is its own choice, so you can pay for LinkedIn yearly and Instagram monthly (or the other way round) as long as each one is within your plan's term.

Q: Does choosing a term for new seats change the seats I already have?
A: No. Seats you already own keep their term, their rate, and their renewal date. A new purchase never moves them.

Q: I bought seats on the wrong term. Can I switch them?
A: Yes, and you can do it yourself. Open Billing, find your LinkedIn seats card and choose the term you want. The unused time on the seats you already hold is credited against the new charge, so nothing is paid for twice. A seat term can never be longer than your plan term, so if the term you want is not offered, move your plan to that term first.

Q: What happens to my seats if I change my plan's billing term?
A: Any seats billed together with your plan move to the new term with it, so you stay on one subscription with one renewal date. Seats that were on their own separate subscription keep their own term and date.

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.

Why is my LinkedIn account disconnected?

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

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:

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/why-is-my-linkedin-account-disconnected; '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/why-is-my-linkedin-account-disconnected.

Understanding LinkedIn campaign acceptance rate

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

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

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.

LinkedIn Audiences & Enrichment

Audiences are collections of LinkedIn profiles used as targets for LinkedIn campaigns:

Creating Audiences:

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:

  1. The system processes profiles in small batches (up to 15 per tick, every 3 minutes) to mimic natural LinkedIn browsing.
  2. Each profile is fetched individually through your connected LinkedIn account — the same way you would view a profile manually on LinkedIn.
  3. A daily cap limits how many profiles can be enriched per day based on your account strategy (see below).
  4. When the daily cap is reached, enrichment pauses automatically and resumes at midnight UTC.
  5. 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) Too many errors in one day — enrichment stops itself 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.

LinkedIn Campaigns

Create and manage LinkedIn-only outreach campaigns from the LinkedIn section.

Creating a LinkedIn Campaign:

  1. Go to LinkedIn > Campaigns from the sidebar.
  2. Click 'Create Campaign' and give your campaign a name.
  3. Select the LinkedIn account to use for sending.
  4. Select an audience — choose one or more audiences as campaign targets.
  5. 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:

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:

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.

LinkedIn Posts & Engagement

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.

LinkedIn Likes API (Post Reactions)

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:

  1. Go to Settings > API Keys and create a new API key.
  2. Select the 'linkedin:read' and 'linkedin:write' scopes.
  3. Copy your API key (shown once — save it securely).
  4. Use the key in the Authorization header: Authorization: Bearer YOUR_API_KEY

Available Endpoints:

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: Purpose & Workflow

LinkedIn templates serve as reusable building blocks for your outreach campaigns. Here is how they work and why they matter:

What Templates Do:

Why You Edit Messages in Campaigns:

Template Types:

Workflow:

  1. Create templates in LinkedIn > Templates for your best-performing messages.
  2. When building a campaign step, click the template picker to select one.
  3. The template content fills the step editor — customize it for this specific campaign.
  4. Changes to the step do NOT modify the original template (they are independent after selection).
  5. 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.

Multi-Account LinkedIn Setup

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:

Using Multiple LinkedIn Accounts in One Campaign (Step by Step):

  1. Go to Campaigns > New Campaign.
  2. Choose LinkedIn as the channel.
  3. 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').
  4. Once you select more than one account, a Rotation option appears. Choose Round Robin for an even, balanced split.
  5. Finish building your steps (invite, follow-up message, and so on) and launch.

What Round Robin Does:

Quick Example:

Availability:

Using Sales Navigator from a Different Account:

Account Type Detection:

Premium Cookie Setup:

Best Practices:

Why is my LinkedIn campaign paused, or only using one account?

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:

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:

  1. Go to Campaigns > New Campaign (or open an existing campaign and choose Edit).
  2. Choose LinkedIn as the channel.
  3. Tick every account you want to send from (or use 'Select All').
  4. Once you select more than one account, a Rotation option appears — choose Round Robin for an even, balanced split.
  5. 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.

LinkedIn Proxy & IP Security

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:

How It Works:

  1. When you connect a LinkedIn account, WarmySender assigns a dedicated fixed IP address to that account
  2. All LinkedIn requests for that account are routed through the assigned proxy — never directly from WarmySender servers
  3. The proxy IP is fixed (no rotation) and not shared with any other LinkedIn account
  4. 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:

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):
20+ 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

Examples:

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.

LinkedIn Connection Request Notes

Connection request notes are the short personalized messages attached to LinkedIn connection invitations.

Blank vs. Personalized Notes:

Why You Might See Save Issues:

Best Practices for Invite Notes:

Example Invite Notes:

Note Character Counter:
The campaign step editor shows a live character counter (e.g., '147/300') to help you stay within LinkedIn's limit.

LinkedIn InMail Best Practices

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:

Writing Effective InMails:

Subject Line (Critical):

Message Body:

InMail in WarmySender Campaigns:

Best Practices:

Common Mistakes:

LinkedIn Profile Editing

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:

  1. Go to LinkedIn > Accounts
  2. Click on an account to open details
  3. Click 'Edit Profile' at the bottom of the dialog
  4. Update your headline, summary, or Open to Work status
  5. 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.

LinkedIn Message Management

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.

LinkedIn Analytics: Followers & Engagement

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:

  1. Resync Messages — Refreshes your messaging data from LinkedIn. Use this if messages appear out of sync or are missing. This is a lightweight operation.
  1. 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.

LinkedIn Recruiter Search Filters

Overview

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

  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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.

LinkedIn Skill Endorsements (Beta)

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:

  1. Go to LinkedIn > Conversations or search for a prospect
  2. Click on the prospect's name to open their profile details
  3. Scroll to the 'Skills' section — you will see their listed LinkedIn skills
  4. Click the 'Endorse' button next to the skill you want to endorse
  5. The endorsement is submitted immediately and logged in the prospect's activity timeline

When to Use Standalone Endorsements:

—— BEST PRACTICES & GUIDELINES ——

—— RATE LIMITS & SAFETY ——

Endorsements share the daily engagement limit with post likes and comments. Here is the ramp-up schedule:

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:

Account Safety Notes:

—— 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.

LinkedIn Proxy Management

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:

  1. Auto — WarmySender automatically assigns a proxy that matches your account's location. Best for most users.
  1. 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.
  1. 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:

  1. Go to LinkedIn > Accounts
  2. Click on an account to open details
  3. Click 'Change Proxy' next to the current proxy display
  4. Select your preferred mode and configure it
  5. 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.

Why my LinkedIn campaign sometimes sends outside my chosen hours (and how we fix it)

Every WarmySender channel — cold email, email warmup, LinkedIn, Instagram and multichannel — respects 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:

  1. Open your campaign in the LinkedIn dashboard.
  2. 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').
  3. Look at the 'next scheduled send' indicator on the campaign card. It should always show a time inside your window.
  4. 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.

LinkedIn webhooks and Slack notifications: how replies and accepted invites flow to your team

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.

Example payload (`linkedin.reply_received`):

{
"event": "linkedin.reply_received",
"id": "evt_2026_04_28_aa11bb22cc33",
"occurredAt": "2026-04-28T09:34:18.512Z",
"workspaceId": "ws_abcdef0123456789",
"data": {
"campaignId": "camp_8c2f...",
"enrollmentId": "en_4a7b...",
"prospectId": "prs_4a7b...",
"prospectName": "Zoltan A. Vardy",
"prospectLinkedinUrl": "https://www.linkedin.com/in/zoltanvardy/",
"linkedinAccountId": "lia_9d11...",
"messageText": "Sounds good, send me the deck.",
"threadId": "thr_1f2e...",
"receivedAt": "2026-04-28T09:34:14.000Z"
}
}

Where to subscribe:

  1. Open Settings → Webhooks (`/settings?tab=webhooks`).
  2. 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.
  3. 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.
  4. Save. WarmySender returns a webhook secret — save it once (shown only on creation). Used for HMAC verification on your endpoint.
  5. 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.
  6. 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:

  1. 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).
  2. Check 'Recent Deliveries' on the same page — you'll see the response code and body within ~10 seconds.
  3. If 2xx: your endpoint accepted the test; you should see the message in Slack / Discord / your n8n flow.
  4. If 4xx: signature verification or formatting on your side rejected the payload; check the response body in Recent Deliveries for the error message.
  5. If 5xx: your endpoint had a server error; we'll retry up to 10 times with exponential backoff (1 min → 72 h).
  6. 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:

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.

Multi-account workspace acceptance behavior

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.

Why does my LinkedIn UI sometimes lag behind reality?

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.

How does WarmySender redistribute schedule when I disconnect?

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.

How WarmySender verifies InMail delivery (and what to do if your daily cap shows the wrong number)

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.

Why Won't My Sales Navigator List Import?

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:

  1. 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.
  2. 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.
  3. 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)? A reconnect can bring the account back without its Sales Navigator access attached even though your subscription is still active, so the plan reads as Premium and the list comes back empty. Two things now happen for you. First, an account that merely reads Premium no longer blocks the attempt by itself — the import goes ahead and LinkedIn gives the real answer, instead of being refused before it is tried. Second, when the access is on the connection but simply isn't switched on, WarmySender switches it on and retries the import once, on its own, so the list loads without you touching anything. If the access genuinely isn't on that connection you now get a clear explanation instead of an empty result: use 'Re-check Sales Navigator access', which sits on every connected account under LinkedIn > Accounts and on the import screen. If the re-check still can't find it, reconnect the account with Sales Navigator open in your browser so the connection picks it up. Setting the plan by hand only changes the label — the re-check is what actually restores access.

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.

What Happens to My LinkedIn Seats and Accounts If a Payment Fails?

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.

How to Recover a Restricted LinkedIn Account

Recovering a restricted LinkedIn account is done with LinkedIn, not inside WarmySender — but WarmySender handles its own side automatically. Here is the whole picture.

What 'restricted' means: LinkedIn has placed a hold on your account. Depending on the reason it is either temporary (access returns once you complete a step, often within 24-72 hours) or permanent. Common reasons, from LinkedIn's Account restrictions page (linkedin.com/help/linkedin/answer/a1340522): automated-activity or prohibited-software use, identity or profile issues, a compromised account, or content that breaks LinkedIn's Professional Community Policies. You are not always told which one applies, and the recovery path is the same either way.

How to get access back (all on LinkedIn's own site — no tool can lift a LinkedIn restriction):

  1. Sign in to LinkedIn in a normal browser and follow the on-screen prompts. A restricted account almost always shows you the path the moment you log in, and completing it is often all it takes.
  2. Verify your identity if asked. The usual step is identity verification through Persona, LinkedIn's identity-verification provider: you pick the country that issued your ID and take a clear photo of a valid government-issued ID card, driver's license, or passport (a library or school card won't be accepted), and sometimes a photo of yourself. See LinkedIn's 'Verify your identity to recover account access' (linkedin.com/help/linkedin/answer/a1342692). LinkedIn says this information is generally deleted within about 14 days.
  3. If you can't use Persona, residents of Canada, the EU, or the UK can print LinkedIn's Affidavit of Identity, sign it before a Notary Public, and attach the scan to a support case (same page as above).
  4. If it's a content decision you believe is wrong, appeal it — log in and follow the prompts, or use LinkedIn's Account Restriction Appeal form (linkedin.com/help/linkedin/ask/ts-f-appeal).
  5. Wait for LinkedIn's decision before touching the account again. Repeatedly retrying does not speed anything up and can work against you. For permanent cases, see 'Permanent account restrictions' (linkedin.com/help/linkedin/answer/a1447823) — be realistic, a permanent restriction is often the end of the road for that account.

What WarmySender does automatically (nothing for you to fix on our side):

How to keep it from happening again: let the ramp finish; personalise every invite; keep connection requests modest and spread out; run only one automation tool per account; keep your own profile complete and genuine; and connect the safest way (see /documentation/why-wont-my-linkedin-account-connect). No tool makes an account immune — LinkedIn's own Help pages are clear that automated activity carries risk — but conservative pacing keeps you well inside normal-looking behaviour, which is the best protection there is. Account safety always wins over speed here, because a permanently restricted account can be impossible to get back.

Full guide: /documentation/recover-a-restricted-linkedin-account

Instagram

Instagram Outreach Overview

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:

Here's how to get started:

  1. 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.
  1. Add an Instagram seat — Go to Billing and add an Instagram seat ($12 per seat per month, or $120/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.
  1. 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.
  1. 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.
  1. 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.
  1. 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'.
  1. 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:

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'.

Full guide: /documentation/instagram-outreach

Build Your Instagram Audience

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):

  1. Go to the Prospects page and choose Import to upload a CSV.
  2. 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.
  3. 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.
  4. Save everyone to a named list (for example 'Instagram — creators Q3') so you can find and reuse the audience.
  5. 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

Connect Your Instagram Account

Go to Instagram > Accounts and click 'Connect Account', then sign in right there with your Instagram username and password — plus a verification code if you use two-factor authentication. 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 ($12 per seat per month, or $120/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:

  1. Go to Instagram > Accounts and click 'Connect Account'.
  2. 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.
  3. Enter your Instagram username and password in the sign-in box and click Connect.
  4. If your account uses two-factor authentication, you'll be asked for your verification code on the next step. Enter it within 5 minutes — after that the sign-in expires and you simply start again (nothing is lost, and your seat is not used up).
  5. That's it — your account appears on the Accounts page, ready to use.

If a sign-in doesn't work, you'll be told exactly why — a wrong password, a verification code that's needed or has expired, or Instagram temporarily blocking the sign-in. Nothing is left half-connected: a failed attempt never uses up your seat, so you can simply try again. If Instagram blocked the attempt, wait a little while, sign in to Instagram on your phone once to clear any security prompt, then try again here.

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.

What happens to your password? It's used once, to sign you in to Instagram, and it is never stored by WarmySender. From then on your account stays connected through that signed-in session, the same careful way the official Instagram apps work — so you never have to enter it again unless Instagram asks you to sign in afresh.

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

How Instagram Outreach Stays Safe

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

Instagram Daily & Hourly Limits

Every connected Instagram account has one combined budget of 100 actions per day and 10 actions per hour. Follows, profile views, likes, comments and DMs all draw from that same shared pool — it's 100 actions in total, not 100 of each. Replies you send to people who messaged you are unlimited and never count.

How the shared pool works: if an account has already done 40 follows and 30 DMs today, that's 70 of the 100 used, leaving 30 for anything else. The hourly cap sits on top, so no account ever does more than 10 actions in a single hour — that's what stops activity arriving in a sudden burst, which is the pattern Instagram restricts accounts for.

What happens when a limit is reached: nothing breaks and nothing is lost. WarmySender simply pauses that account's new outreach and resumes on its own — the next hour for the hourly cap, the next day for the daily cap. Every prospect stays exactly where they are in the sequence and carries on from that point.

New accounts start lower: a brand-new or freshly connected account doesn't begin at 100 a day. It starts with a small daily number in the first week and builds up gradually over several weeks. 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 an account healthy.

Planning your numbers: a typical warm-up sequence spends about 3 actions per prospect (for example Follow, Like, then DM — waits and branches don't count). At the full daily ceiling that's roughly 33 new prospects per account per day. To reach more people at the same pace, add another seat and connect another account rather than pushing one account harder.

Your own campaign pace setting sits inside these limits, never outside them. If what you've asked for would go faster than is safe, safety wins and the step simply waits its turn.

Where to see it: 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.

We never loosen these limits to send faster. A restricted Instagram account is hard to get back, so this is a line WarmySender holds for you.

Full guide: /documentation/instagram-daily-and-hourly-sending-limits

Build an Instagram DM Sequence

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

Why Some DMs Land in Message Requests

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

Manage Your Instagram Inbox

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

Instagram Seats & Billing

The Instagram add-on is billed per seat — one seat per Instagram account you connect and run — and you choose how often you pay for it: monthly, yearly, or every 3 years. 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.

Choosing how you pay for Instagram seats

You pick the Instagram add-on's billing term yourself on the Billing page, when you buy. It's a separate choice from your plan and from your other add-ons — your LinkedIn seats can sit on a different term to your Instagram seats, and either can differ from your plan.

Worked example — 2 seats (two Instagram accounts). On monthly you pay two lots of $12/seat/month every month. On yearly you pay two lots of $120/seat/year once, and nothing again until the same date next year. The longer the term, the lower the rate per seat — and the rate you start on is the rate those seats keep.

Why you can't choose a term longer than your plan's

Your add-on term can match your plan's term, or be shorter — never longer.
• On a monthly plan, add-on seats are billed monthly.
• On a yearly plan, you can pay for seats monthly or yearly.
• On a 3-year plan, you can pay for seats monthly, yearly, or every 3 years.

That's a guard rail, and it's there to protect you rather than to limit you. A seat only does anything while your plan is active: if the plan ends, connected Instagram accounts are set aside and campaigns pause. So seats prepaid for three years against a plan you can stop next month could sit paid-up long after there's a plan to use them with — and we'd rather not sell you that. If you want the longer commitment (and the lower rate) on your seats, move your plan to that term first on the Billing page; the longer add-on options open up straight away.

One renewal date, or two

Seats you already have keep their term and their price: picking a term applies to the seats you're buying at that moment, and a new purchase never moves the ones you already own. To move existing seats onto a different term, email [email protected] with your account email and the term you'd like — it isn't self-serve yet, because it means unwinding part of a period you've already paid for. If you change your PLAN's billing term, any seats billed together with your plan move to the new term with it.

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 how often you'd like to pay for them — the terms your plan allows are the only ones shown.
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.

Which term should I pick? Monthly gives you the freedom to change your seat count, or stop, any month. A longer term locks in a lower rate per seat for the whole commitment. If you'd like to move seats you already have onto a longer term, email [email protected] — it isn't a self-serve switch yet.

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

Instagram Outreach Best Practices

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.

  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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

Platform

Why an Account Can Show Connected but Stop Sending

Every LinkedIn, WhatsApp and Instagram account you connect is re-checked with the network itself on a regular schedule — roughly every 30 minutes — rather than trusting what we last saw. If a session has quietly lapsed on the network's side, the account stops showing as Connected and switches to 'Reconnect needed' within about half an hour, and any campaign using it pauses instead of pretending to send.

Why an account can go quiet without you doing anything:

What you'll see when this happens:

  1. The account shows 'Reconnect needed' on its channel page (LinkedIn > Accounts, WhatsApp > Numbers, or Instagram > Accounts).
  2. Campaigns using that account pause on their own. Nothing is lost — remaining prospects stay queued in place.
  3. You get an email letting you know which account needs attention.

What to do:

  1. Open the channel page and find the account marked 'Reconnect needed'.
  2. Click Reconnect and complete the short flow — for LinkedIn and Instagram that's signing in again and clearing any security check; for WhatsApp it's re-scanning the code under Settings > Linked devices.
  3. Once it reads Connected again, resume your campaigns from the campaign page. They pick up exactly where they stopped, with the same prospects and the same sending pace.

Good to know:

Email & LinkedIn Templates

Templates save time by letting you reuse proven email and LinkedIn messages:

My Templates:

Template Categories (12):
Cold Outreach, Follow-up, Meeting Request, Introduction, Value Proposition, Case Study, Recruiting & HR, Partnership, Re-engagement, Agency Services, Other

Template Library (Pre-built):

Using Templates:

Best Practices:

Unified Inbox

The Unified Inbox aggregates all campaign replies across email and LinkedIn in one place:

Two Channels:

Filtering:

Thread View:

Replying:

Sentiment Tagging:

Bulk Operations:

Sync:

Thread Notes:
Add internal team notes to any thread — visible only to your workspace members, not sent to the prospect.

How We Measure Campaign Revenue (First-Touch Attribution)

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:

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:

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.

Analytics & Reporting

Track your outreach performance from the Analytics page:

Overview Dashboard:

Analytics Tabs:

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:

Teams & Workspaces

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 ($12/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:

Important — Team Members Are Per-Workspace Too:

Adding a Colleague Who Is Already in Another Workspace:

Say your colleague is already in your first workspace, you have just created a second one, and you want them in that one too. Nothing carries over on its own. You switch to the new workspace first, then invite them again there. It takes about a minute.

  1. Click the workspace switcher at the top of the sidebar, then click the name of the second workspace. Everything on screen now belongs to that workspace.
  2. In the sidebar, click Settings, then open the Team tab.
  3. In the 'Team Members' card, click 'Invite'.
  4. In the 'Invite Team Member' dialog, type their address under 'Email Address', choose 'Admin' or 'User' under 'Role', then click 'Send Invitation'.
  5. Their address now sits in the 'Pending Invitations' table underneath until they accept.

What Your Colleague Sees After You Invite Them:

  1. They get an email with an invitation link.
  2. They open the link and sign in. They must be signed in with the same email address you sent the invitation to — a different address will not be accepted, and the page warns them before they try.
  3. They click 'Accept Invitation'.

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:

Team Member Limits by Plan:

Inviting Team Members:

  1. Go to Settings > Team tab
  2. Click 'Invite' (disabled when at plan limit — pending invites count toward limit)
  3. Enter the invitee's email address and select a role (Admin or User)
  4. They receive an email with a secure invitation link
  5. They click the link, log in (or create an account), and accept the invitation
  6. They're added to your workspace with the assigned role

Pending Invitations:

Workspace Switching:

Shared Resources:

Downgrading Plans & Workspaces:

Mailboxes vs. Team Members (Important Distinction):

Common Use Cases for Multiple Workspaces:

Billing & Subscription Plans

Manage your subscription from the Billing page:

Subscription Plans (monthly billing):

Annual Billing (save 55% — limited time):

How the limited-time 55% annual offer works:

All Paid Plans Include:

LinkedIn Seats (Add-On):

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:

Billing Management:

Subscription Statuses:

When your subscription becomes inactive, active campaigns are automatically paused. They auto-resume when you re-subscribe.

Suppression Lists & Compliance

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:

Automatic Suppression:
Two things add an address to your blocklist automatically:
• A bounce — when a campaign email is rejected by the recipient's mail server, that address is added immediately and every future campaign skips it. This also covers the slower case where the message is accepted first and a delivery-failure notice arrives in your sending inbox minutes or hours later; once that notice is matched back to the prospect, the address is added the same way.
• An unsubscribe — when someone clicks the unsubscribe link in your email footer, or replies asking to be removed (unsubscribe, opt out, remove me, stop emailing me, and the everyday equivalents in German, French, Spanish, Portuguese, Dutch and Italian), their address is added right away and their enrollment stops. "Not interested" and "no thanks" are deliberately not treated as opt-outs.

Every entry keeps a short reason, so you can always see why an address is on the list: the automatic ones record the bounce or the unsubscribe, and the ones you add yourself keep whatever note you typed. Everything else on the list got there through one of the three methods above.

Spam complaints are NOT added automatically, and this one catches people out. When a recipient hits 'Report spam', that report goes to their own mailbox provider — not to WarmySender. Your campaigns send from your own connected mailbox, so no copy of the complaint ever reaches us, and we cannot put that person on your blocklist for you. If you find out that someone complained, add them manually.

Enforcement:

CAN-SPAM Compliance:

GDPR Compliance:

Best Practice: Regularly review and clean your suppression list. Add competitor domains, existing customer domains, and known bad addresses proactively.

Records look correct but mail goes to spam

A records check can come back green and still have asked the wrong half of your domain. The most common cause of "my records are fine but my mail goes to spam" is that your domain is pointed at TWO different sets of nameservers at the same time, and one of those sets is stale — usually a leftover parking or previous-host entry that was never removed.

Why that breaks email: nameservers are the servers authorised to answer questions about your domain, and every set listed is treated as equally authoritative. A receiving mail server picks one and believes what it says. Ask the good set and it gets your real SPF, DKIM and DMARC. Ask the stale set and it gets a placeholder instead of a record — often a single word such as "expired" — decides your mail is unauthenticated, and files it as spam. Same message, same day, same list, opposite outcomes.

The symptom set that points at this: records read as valid, mailboxes read as healthy, a large share of mail goes to spam, your daily volume has come down on its own and stayed down, and you have ZERO bounces. Zero bounces is a clue, not reassurance — a bounce means a receiver REFUSED your message and said so, while spam filing is silent. Bad placement with a clean bounce report is the fingerprint of an intermittent fault.

Why every checker says you are fine: a records checker asks one nameserver and reports what it said, truthfully. If it happens to ask the good set it reports green every time. The fault is invisible to the tool you would naturally reach for.

How to check it in two minutes — at your REGISTRAR, not your DNS host and not a checker:

  1. Log in to whoever you renew the domain with.
  2. Open the domain and find Nameservers (sometimes DNS or Manage DNS) — the short list of server names, not the long list of records.
  3. Count the entries. Two from one host is normal. Four, or a mix of two different companies, is the fault.
  4. Read the names. If one pair mentions parking, "for sale", a coming-soon page, or a host you stopped using, that is the pair to remove.

How to fix it: first confirm which pair is live by checking that your SPF, DKIM, DMARC and mail-server records are all present in your DNS host's own panel — removing the wrong pair turns a partial problem into a total one. Then edit the registrar's nameserver list down to only that pair and save. Changes spread across the internet in a few hours and can take up to 48. There is nothing to switch off and nothing to restart; your campaigns and warmup keep running throughout.

The other cause — your domain has stopped resolving at all. If a domain expires or a registrar puts it on hold, nothing answers for it, so there is no SPF, DKIM, DMARC or mail-server record because there is nowhere for one to exist. Here the usual advice is actively wrong: adding records cannot help. Renew the domain or clear the hold first, then check that your nameserver list survived the lapse (some registrars strip it) and count the entries while you are there.

What WarmySender tells you, in this order, because each earlier case makes the later ones meaningless: (1) your domain is not resolving, (2) your nameservers disagree, (3) a record was not found. All three are warnings, never blocks. Nothing is paused automatically — a reading of your DNS never stops you sending.

Why "a record was not found" is worded mildly: on real sending across the platform, domains with no SPF record on file do not place worse than domains that have one. Publishing a full set of records is still right, but a single absent record is not what is behind a sudden collapse in placement.

Why your volume is low and what lifts it: when measured placement turns bad, WarmySender reduces how much that mailbox sends each day — protection, not a penalty. Volume rises again on its own as placement improves, judged on a rolling week rather than a single day. No date is promised, because that would be a guess. One honest limit: we can see whether warmup mail landed in the inbox or the spam folder of the mailbox that received it, but we cannot see which tab of an inbox a message was filed under, and no provider reports that to anyone.

Full walkthrough with a worked example, the two-minute registrar check, the fix, and an 11-question FAQ: warmysender.com/documentation/why-my-mail-goes-to-spam-when-my-records-look-correct

Email Deliverability (SPF, DKIM, DMARC)

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):

DKIM (DomainKeys Identified Mail):

DMARC (Domain-based Message Authentication, Reporting & Conformance):

Verification:

Common DNS Providers:

Impact: Domains with all three records properly configured see significantly higher inbox placement rates (80%+ vs. 40-60% without).

Custom Tracking Domains

Set up a custom tracking domain for better email deliverability:

Why Custom Tracking Domains:

Setup Steps:
1) Go to Settings > Tracking Domains
2) Click 'Add Domain' and enter your tracking SUBDOMAIN (e.g., track.yourdomain.com). It must be a subdomain: entering your bare domain (yourdomain.com) is refused, with a message explaining that a tracking domain must be a subdomain and offering track.yourdomain.com as a one-click fix. Pointing your bare domain at us would take your own website and email routing offline
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:

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.

Rule (enforced, not just advice): a tracking domain must be a SUBDOMAIN of a domain you own — track.acme.com, not acme.com. Bare/apex domains are rejected at the point you add them. Use a subdomain of the domain you actually send from (if you send from @acme.com, use track.acme.com) so your links match your sending address.

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.

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 — it has to be a subdomain, and we recommend a 'track' subdomain of your sending domain, e.g. track.yourdomain.com. If you type your bare domain (yourdomain.com) it is refused: WarmySender tells you a tracking domain must be a subdomain and offers track.yourdomain.com so you can accept the correction in one click.
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.

One setting that catches most people out: if your DNS is managed at Cloudflare, make sure the new record is set to 'DNS only' — the cloud icon next to the record should be grey, not orange. If the record is proxied, your tracking links are routed somewhere we can't confirm and verification will keep failing no matter how long you wait. Most other DNS providers have no such toggle; if you don't see one, there's nothing to change.

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 'Needs attention' — double-check the record's name and target, give DNS a little more time, and click Verify again. Nothing checks the domain for you before that first Verify click, so a domain you added and left alone will simply sit at 'Not checked yet' until you come back and press it.

Status meanings:

How to see it working in a real email:

Verified status is the reliable answer, but if you'd like to see it with your own eyes, send yourself a test email from a campaign with tracking switched on. Open it, hover over any link (or long-press it on a phone) and look at the web address your browser previews at the bottom of the screen. It should start with your own tracking subdomain — track.acme.com — rather than a shared one. That's the same thing your prospects see. Two things worth knowing: give it a few minutes after verifying before you send your test, as the switch-over isn't always instant; and this only applies to emails sent AFTER the domain was verified, since messages already sitting in someone's inbox keep the links they were sent with.

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:

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 say 'Not checked yet' or 'Needs attention' after I added the record?
If it still says 'Not checked yet', it's simply waiting on you — a domain is only checked when you click Verify, so nothing happens until you press it. If it says 'Needs attention', we looked and couldn't reach it yet. 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.

My DNS is at Cloudflare and it still won't verify. What am I missing?
Almost always the proxy toggle. Open the record you just added and set it to 'DNS only' — the little cloud icon beside it should be grey, not orange. When the record is proxied, your tracking links are routed somewhere we can't confirm, so verification keeps failing however long you wait. Switch it to DNS only, save, and click Verify again.

Which subdomain should I use — can I use my main domain?
No — your main (bare) domain is refused, on purpose. Use a subdomain like track.acme.com. Your bare domain is where your website and email routing live, so repointing it would take your own site offline; if you try to add acme.com you'll be told a tracking domain must be a subdomain and offered track.acme.com instead. A new 'track' subdomain is completely separate and doesn't affect your website, your email, or anything else you already have set up. The name doesn't have to be 'track' — links.acme.com or go.acme.com work just as well.

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.

Bounce Shield Protection

A bad list is the fastest way to damage a sending domain, so WarmySender guards against it in two ways. Both are on by default and neither needs configuring.

1) Every bounced address is suppressed automatically
The moment an address hard-bounces it goes on your suppression list and the contact is marked bounced. Nothing sends to it again — not the rest of that campaign, and not a later one. You never have to clean it out by hand.

2) A campaign that bounces too much stops itself
Every campaign carries its own bounce-rate threshold, 5% by default. Once a campaign has sent at least 50 emails, if its bounce rate is above that threshold the campaign stops and the campaign card shows you why. The 50-send minimum is there so two unlucky bounces on a small campaign can't trip it.

A campaign stopped this way stays stopped until you resume it. That is deliberate — what fixes bounces is a cleaner list, and resuming on its own would just send more of the same. When you do resume, the bounce measurement starts fresh from that moment, so the earlier bounces don't immediately stop it again.

3) You can make it stricter, never looser
Settings → Bounce Shield → 'Use my own, stricter limit' sets a lower number for every campaign in the workspace. A single campaign can also carry its own limit in the campaign editor's advanced sending settings. Where both exist we always use whichever is lower, so this can only ever tighten protection — setting it above a campaign's own limit changes nothing at all. 3% is a sensible choice if you send to lists you didn't build yourself.

You'll know when it fires: the workspace owner gets an email naming the campaign, the bounce rate it reached and the limit it crossed, so a stopped campaign is never a silent one. That email can be switched off in the same place; the pause itself always happens.

What to do when a campaign stops for bounces:

Best practice: verify every list before you import it. A verified list is the difference between a campaign that runs and one that keeps stopping.

Full walkthrough — what the number means, the arithmetic worked through, the list-cleaning steps, and why resuming is deliberately a manual step: warmysender.com/documentation/why-did-my-campaign-pause-for-bounces

Why is my email blocked by Microsoft or Outlook?

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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:

Warmup CANNOT:

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.

API Keys & Webhooks

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:

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:

For full API reference, visit warmysender.com/docs/integrations

Onboarding & Product Tours

WarmySender includes guided tours to help you get started:

Main Onboarding Tour:

Page-Specific 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.

Security & Compliance

WarmySender takes security seriously. Here is an overview of our security practices:

Data Encryption:

Authentication & Access:

Infrastructure:

Email Security:

Compliance:

Data Retention:

Security Page:
For our full security policy, visit warmysender.com/security.
Privacy Policy: warmysender.com/privacy.

For security inquiries, contact us at [email protected].

Webhook Integration Guide

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):

  1. Go to Settings > Webhooks.
  2. Click 'Create Webhook'.
  3. Enter your endpoint URL (where WarmySender sends the event data).
  4. Select which events to subscribe to.
  5. Copy the webhook secret for signature verification.
  6. Click 'Test' to send a test event and verify your endpoint.

Available Events:

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:

Integration Examples:

CRM Sync (HubSpot, Salesforce, Pipedrive):

Slack/Teams Notifications:

Zapier / Make / n8n:

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.

API Quickstart Tutorial

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:

Full API Reference:
Visit warmysender.com/docs/integrations for complete endpoint documentation with request/response examples, error codes, and webhook setup.

Best Practices:

Create & Enroll Prospects with 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:

Step 1 — Create an API key with the right permissions:

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:

For a full walkthrough with curl examples, see /documentation/create-and-enroll-prospects-with-the-api. Related: 'API Quickstart Tutorial', 'Managing Campaigns via API'.

Webhook Events Reference

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.

Payload Format (all events):
{
"type": "email.clicked",
"data": {...event-specific fields... },
"timestamp": "2026-03-20T14:30:00.000Z"
}

Headers Included:

Subscribing to Events:

Webhook Signature Verification

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:

  1. When you create a webhook, you receive a secret (format: whsec_xxxx). Save it securely.
  2. Every webhook delivery includes an X-Warmy-Signature header.
  3. The header format is: t=<timestamp>,v1=<hex_signature>
  4. To verify, reconstruct the signature using your secret and compare.

Verification Steps:

Step 1: Extract timestamp and signature from X-Warmy-Signature header:

Step 2: Build the signature payload:

Step 3: Compute HMAC-SHA256:

Step 4: Compare signatures:

Step 5 (Optional): Check timestamp freshness:

Node.js Example:
const crypto = require('crypto');

function verify(secret, signatureHeader, body) {
const [tPart, vPart] = signatureHeader.split(',');
const timestamp = tPart.replace('t=', '');
const signature = vPart.replace('v1=', '');
const payload = timestamp + '.' + body;
const expected = crypto.createHmac('sha256', secret).update(payload).digest('hex');
return crypto.timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expected, 'hex'));
}

Python Example:
import hmac, hashlib

def verify(secret, signature_header, body):
parts = dict(p.split('=', 1) for p in signature_header.split(','))
payload = parts['t'] + '.' + body
expected = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()
return hmac.compare_digest(parts['v1'], expected)

Common Mistakes:

Domain Reputation Monitoring

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:

External Monitoring Tools (Recommended):

Reputation Factors:

Improving Reputation:

  1. Verify email lists before sending (use Email Verifier).
  2. Warm up properly — do not skip the 2-3 week warmup period.
  3. Start campaigns with low volume (20-30/day) and increase gradually.
  4. Monitor bounce rates and stop campaigns immediately if above 5%.
  5. Keep warmup running in Maintenance mode alongside campaigns.
  6. Remove non-engaging prospects after 3-4 touchpoints.
  7. 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.

Many Mailboxes on One Hosting Account Show 'Reconnect'

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 Did Several Mailboxes Suddenly Show 'Reconnecting'?

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

How We Compile the Email Warmup Tools Comparison

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

How We Compile the Email Deliverability Benchmarks

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

Provider Blocks — Outlook, Gmail, Yahoo

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.

Full explainer: /documentation/provider-blocks

What Our Deliverability Numbers Mean (and What They Don't)

WarmySender shows two different kinds of deliverability information, and they answer two different questions. It is easy to read one as the other, so here is exactly what each one measures.

Where to look: three places:

All three read the same underlying measurement, so they agree with each other; they differ only in how much detail they show and how much of your account they cover.

What the Deliverability tab measures:
The Inbox Rate Trend and Mailbox Health Matrix under Analytics > Deliverability are built entirely from warmup mail — the messages your mailboxes exchange with other verified mailboxes in the warmup network. Each day we check the receiving mailbox to see whether a warmup email arrived in the inbox or in the spam folder, and that becomes your inbox rate, spam rate and health score.

So those figures describe your sending account's reputation over time. A rising inbox rate means providers are treating mail from that mailbox more favourably. It is the number to watch before and while you run a campaign, and it is exactly what warmup exists to improve.

What those numbers do not tell you:
They do not tell you where a campaign email landed. A campaign email travels from your mailbox to a real prospect's mailbox, which we have no access to. Once the recipient's mail server accepts the message, whatever happens next — inbox, spam folder, or a category tab — happens inside an account we cannot see. That is a property of email itself, not a gap in your reporting.

One honest caveat about tabs: mail providers do not reveal which tab a message was filed under, so when a warmup email is sorted into Promotions or Updates we count it as inbox. Read 'inbox' as 'not in the spam folder' rather than 'in the Primary tab'.

What you can see for a campaign:

Why the two cannot be merged:
Warmup mail lands in mailboxes we can check, so we can report its folder. Campaign mail lands in mailboxes only your prospect can see. The first is a reputation gauge you can watch daily; the second is only visible to us up to the moment it is accepted or refused.

Checking placement yourself with a test send:
There is one thing you can do that no dashboard can do for you: look with your own eyes. Open the campaign, use Send test, and send the email to an address you own — ideally one at the same mail provider your prospects use, since that is the filter you actually care about. Then check both the inbox and the spam folder of that account.

The test arrives exactly as a prospect would receive it: the same subject line, the same opt-out footer, the same headers, and no test label of any kind. That is deliberate, because a message marked as a test is not the message being filtered — anything added to it would change the very thing you are trying to observe.

Treat the result as one honest data point rather than a score. It tells you where this message landed for one recipient at one provider on one day, which is genuinely useful when you are choosing between two subject lines or checking a new mailbox before you launch. It does not tell you what will happen across a thousand prospects — for that, watch the Inbox placement figure your warm-up mail produces.

A note on placement testing:
A separate class of tool estimates placement by mailing a panel of its own test addresses and reporting which folder each copy reached. WarmySender does not do that — there is no test panel and no test send — and such tools sit alongside warmup rather than replacing it. If you use one, read its result next to your warmup inbox rate: one estimates where a sample message lands, the other builds the reputation that decides where your real mail lands.

Frequently asked questions:

Where do I see my inbox placement on a campaign?
On the campaign's own page, in the Inbox placement card. It shows the last 7 days of warm-up mail from the mailboxes that campaign sends from, measured as inbox versus spam inside real mailboxes. If it says 'Not enough warm-up mail yet', warm-up has not yet produced enough checked mail for those mailboxes to report a fair figure — leave warmup running and it will fill in. For the mailbox-by-mailbox picture, follow the link to Analytics > Deliverability.

Does the test email land where the real one would?
It is the closest preview available. Send test now goes out exactly as a prospect would receive it — same subject, same opt-out footer, same headers, no test label — so where it lands in an inbox you own is a fair indication rather than an artificial one. It is still a single message to a single account, so read it alongside your Inbox placement figure rather than instead of it.

Why does my campaign not show a placement number yet?
Because placement is measured on warm-up mail, and there is not yet enough of it from that campaign's mailboxes. This is most common on a mailbox connected in the last few days. Keep warmup switched on and the figure appears once enough mail has been checked.

Can you tell me whether a specific prospect got my email in their inbox?
No, and neither can any other sending tool. Once the prospect's mail server accepts the message, what happens next takes place inside an account nobody but that person can see. What we can show you is whether the message was accepted or refused, whether it was opened or clicked, and how the mailbox that sent it is currently being treated by mail providers.

2026 Bulk Sender Requirements (Gmail, Yahoo, Microsoft)

Four rules apply to every sender at any volume: authenticate with SPF or DKIM, publish valid reverse DNS on your sending IP, send over TLS, and keep your spam-complaint rate under 0.3%. The extra "bulk sender" requirements — full SPF and DKIM and DMARC, plus a one-click unsubscribe header on marketing mail — apply once you send more than 5,000 messages a day to a single provider's consumer inboxes. Google and Microsoft both use that 5,000-a-day line; Yahoo publishes no volume threshold at all and judges you the same way at every volume. Most cold-email programmes never cross 5,000 a day to consumer addresses, so the rules that actually govern you are the four that apply to everyone — and the one that trips people up is the 0.3% spam rate, which is exactly what warmup exists to protect.

What each provider publishes:

Below 5,000 a day — where almost all cold email lives — the bulk-only requirements are good practice but not what governs you. The rules that do are the four that apply at any volume, and the only one you cannot set up once and forget is the spam-complaint rate under 0.3%.

Why warmup is the remedy: a complaint rate under 0.3% means three "report spam" clicks per thousand delivered emails puts you at the edge, and a brand-new domain has no history to absorb a bad week. Warmup builds that cushion — starting a new domain at one email a day and climbing to full speed around the sixth week of sending, then keeping a steady baseline running underneath your campaigns. It also stops you sprinting: Google names "immediately doubling previously sent volumes" as the failure mode, and no provider publishes a day-by-day ramp schedule, so any "day 1: five emails" table sourced to a provider is invented.

What WarmySender handles: it paces every send within safe limits (no send, human- or agent-triggered, can override pacing or raise a limit), warms your domain before you send cold, and holds a brand-new domain to 200 emails a day across every mailbox on it (warmup included) until it is 30 days old with 200 sends behind it and no spam complaints. SPF, DKIM and DMARC live at your domain registrar and stay your responsibility, but the mailbox screen shows the authentication status of every connected mailbox so you can see what is missing.

Full side-by-side table and the provider detail: /documentation/bulk-sender-requirements-2026

WhatsApp

Connect Your WhatsApp Number

Go to WhatsApp > Numbers and click 'Connect number', then open WhatsApp on your phone and go to Settings > Linked devices > Link a device and scan the code we show you. It takes about a minute, there's no password involved, and it only has to be done once per number.

What connecting unlocks: WhatsApp outreach in WarmySender — paced, personalized 1:1 messages sent from your own number, with every conversation readable and answerable in one inbox.

Before you start: you'll need an active paid plan and at least one WhatsApp seat added on the Billing page ($12 per seat per month, $120/seat per year, or $288/seat for 3 years). Each seat connects one number.

Connect your number:

  1. Go to WhatsApp > Numbers and click 'Connect number'.
  2. Answer the short question about how established the number is. This sets your starting pace — a brand-new number should say so and will ease in over its first weeks.
  3. Open WhatsApp on your phone: Settings > Linked devices > Link a device.
  4. Point your camera at the code shown in WarmySender.
  5. The number appears on the Numbers page as Connected. That's it.

Can't scan? Switch to the 'Type a code' option instead. Enter your WhatsApp number in full international format (including the country code, for example +14155550123) and you'll get a short code to type into WhatsApp under Linked devices. The number is used only to generate that code. Both paths produce exactly the same connected number.

The code on screen lasts only a few minutes on purpose. If it expires, ask for a fresh one and start again — nothing is lost and your seat is not used up.

There is no password in this flow. You link WarmySender as a device from your own phone, the same way WhatsApp Web works, so WarmySender never asks for, sees or stores a WhatsApp password. You can see WarmySender listed under Settings > Linked devices in WhatsApp at any time and remove it from there whenever you want. Connecting doesn't log you out of WhatsApp anywhere else — keep using it completely normally, because a number with real everyday conversations on it is a healthier outreach number than one that only ever sends first messages.

Right after connecting: your number starts at the gentle pace you chose, not at full volume. A brand-new number begins at 5 first messages and 20 messages a day in week one, moves to 10 and 40 in week two, and reaches the full ceiling of 20 first messages and 60 messages a day from week three. A number with genuine history starts higher, and there's an explicit 'my number is established' option that starts straight at the ceiling — but the ceiling is still the ceiling, and the hourly limit and the natural pause between messages apply from the very first message either way.

Does your phone need to stay on? Not for your campaign to send. Once your number is linked, WarmySender works as its own device — messages go out and replies arrive while your phone is asleep, out of signal, or charging in another room. WhatsApp does expect the phone to come online now and then: leave it offline for a couple of weeks and WhatsApp signs out every linked device, this one included, and you'd reconnect by scanning a fresh code. Normal everyday use of the number avoids that entirely.

Using WhatsApp at the same time: connecting adds one more linked device, so your phone stays signed in and so do WhatsApp Web and the desktop app. Keep chatting normally — it actively helps. Messages you send from your phone appear in your WarmySender inbox too, and if you answer a prospect from your phone their automated follow-ups stop just as they would if you'd replied here.

If your number needs linking again: linked devices lapse occasionally — after a long period offline, a phone change, or if the device was removed on your phone. Open WhatsApp > Numbers, click Reconnect, and scan a fresh code. While a number waits to be reconnected, outreach on it pauses rather than failing repeatedly, and your prospects stay exactly where they were in the sequence, so nothing is lost and nobody gets a duplicate.

To disconnect: choose Disconnect on the number's card, or remove WarmySender from Settings > Linked devices in WhatsApp on your phone — both have the same effect. Changing your WhatsApp number is a bigger event: WhatsApp unlinks every device when you switch numbers, and the new number is a new identity with no history behind it — connect it as a new number and let it ramp from the start, while conversations on the old number stay with the old number. Your prospects, conversations and campaigns are preserved. Disconnecting and removing a seat are two separate actions, so also reduce your seats on the Billing page if you want the billing to stop.

One number per seat: to run more than one number at the same time, add another seat, then connect the next number the same way. Adding numbers is also the only way to increase your total WhatsApp volume — each number has its own independent budget, and nothing raises a single number's limits.

Regular WhatsApp or the WhatsApp Business app: it makes no difference. Both connect the same way, send the same kinds of messages, and sit under exactly the same limits and the same ramp. There are no pre-approved message templates to submit, no per-message fees and no approval process to wait through — you write your message in plain language and it arrives as an ordinary WhatsApp message from your number. If your number is registered as a business one, WarmySender shows a small Business chip on its card: a label, not a different set of rules.

Your existing conversations: recent conversations on the number come across when you connect, so your inbox isn't empty on day one and anyone who has messaged you before arrives with their history attached rather than as a blank thread. If a conversation ever looks out of date you can refresh that single thread on demand. A conversation being visible here never enrols anyone in anything — WarmySender only messages people who are in a campaign audience you built yourself. Group chats are read-only: they appear so you can follow along, and you answer them from WhatsApp on your phone.

Sharing a number with your team: a number is connected once and everyone in your workspace works out of the same WhatsApp inbox and can reply from it, so you buy a seat per number, not a seat per teammate. What you can't do is connect the same number twice to get twice the volume — the daily, first-message and hourly budgets belong to the number, not to the seat. And messages you send from your phone appear here too: if you answer a prospect on your phone rather than in WarmySender, their automated follow-ups stop just the same, so you never have to remember which device you used.

Full guide: /documentation/how-to-connect-your-whatsapp-number

How WhatsApp Sending Limits Keep Your Number Safe

Every connected number sends inside one budget: up to 60 messages a day in total, of which at most 20 may be first messages to people you have never messaged before, no more than 8 in any hour, and a natural pause of roughly 45 seconds to 2 minutes between messages. Replies you receive never count at all, and a reply you type yourself is never speed-limited. These are ceilings, not settings — WarmySender never loosens them to send faster.

Why first messages are budgeted separately: a conversation someone already agreed to is unremarkable, but a message to a stranger who didn't ask for it is what gets a number blocked or reported. So the 20 first messages are a strict slice of the 60, not an extra allowance on top — 20 first messages leaves 40 of the daily budget for follow-ups.

How a new number builds up:

Answer that question honestly when you connect. Choosing 'established' for a number you bought last week doesn't make it a well-used number, and a fresh number pushed to the ceiling on day one is the most reliable way to lose it.

How replies are treated: replies you receive never count against anything. A reply you type yourself does draw from your daily total — it's still a message leaving your number — but it's never speed-limited: it goes out the moment you hit send, with no pacing pause and no waiting on the hourly ceiling, and it never counts as a first message. So conversations move at your pace, not the scheduler's. Only campaign outreach is paced: the first message to someone new and the scheduled follow-ups after it.

How soon after connecting should you start? Give a freshly connected number a day of normal use before you point a campaign at it — chat with a few real contacts, let the connection settle, then launch. If the number itself is new rather than just newly connected, be far more patient: use it as an ordinary phone number for a while first, then start outreach on the gentlest ramp. Nearly every restriction story is the same story — a fresh number that went straight to volume.

What still works if a number disconnects: everything except sending, and nothing is lost. Outreach on that number pauses rather than retrying into a lapsed link, so nobody gets a duplicate and nobody is dropped; your conversation history, prospects, campaign setup and each person's position in the sequence are all preserved. New incoming messages don't reach your WarmySender inbox while it's disconnected — they're still safe on your phone, and reconnecting brings the threads back into sync. Your other numbers and other channels carry on completely normally, and a paused day never accumulates into a catch-up burst.

If your first messages aren't getting replies: WarmySender automatically tightens your first-message allowance until the reply rate recovers. It's automatic, temporary, and only goes one direction — it lowers how many new conversations a number may start each day, and lifts by itself once replies pick up. It never touches your ability to answer people who wrote to you. Treat it as feedback: the fix is a better-qualified audience or a more relevant opener, not more volume.

Message shape: up to 4,096 characters, and up to 5 attachments of up to 15MB each. Shorter almost always works better for a first message — a two-line message that reads like a person wrote it gets replies; a 4,000-character pitch reads like a broadcast and gets blocked.

Can you raise the limits? No. There is no setting, plan or support request that raises a number's limits. You can always aim lower than the ceiling — a good idea for a new or recovering number — but never higher. If you want more WhatsApp volume, connect another number: each one has its own completely independent daily, first-message and hourly budget. Two numbers running gently reach more people, more safely, than one number pushed hard.

Why a campaign looks slow: messages go out with a random 45-second-to-2-minute gap, under an 8-an-hour ceiling, so a campaign trickles out through the day rather than firing in a batch. If a number hits its hourly ceiling it waits for the next hour; if it hits its daily ceiling it waits for tomorrow. Nothing is lost while it waits — prospects stay enrolled at exactly the step they were on and sending resumes on its own.

Which actions actually count: only messages that leave your number. Campaign messages count and are paced (daily total, hourly ceiling, 45-second-to-2-minute pause; a first message also draws on the first-message allowance). A reply you type counts against the daily total but is never paced and never counts as a first message. Nothing else counts at all — replies you receive, emoji reactions in either direction, editing a message within WhatsApp's 15-minute window, deleting one, and pinning, muting, archiving or marking a thread read or unread. Attaching files doesn't cost extra either: a message with five attachments is one message, exactly like a message with none, because the limits count messages rather than megabytes. One consequence worth knowing: because a reaction isn't a message, it isn't treated as a reply either — a prospect who taps a thumbs-up without answering stays in their sequence and gets the next step as scheduled.

An AI agent can never raise a limit. Agents can create, launch, pause and resume campaigns and enrol people, but there is no tool that raises a ceiling and no tool that sends a message directly; whatever an agent starts is handed to the same scheduler, paced identically.

Full guide: /documentation/how-whatsapp-sending-limits-keep-your-number-safe

Run a WhatsApp Campaign

Go to Campaigns > New campaign > WhatsApp, pick the connected number you want to send from, choose an audience of phone numbers, build a short sequence, and launch. WarmySender then paces every message inside that number's safe budget — up to 60 messages a day, at most 20 of them first messages, no more than 8 an hour — and stops the follow-ups the moment someone replies.

Before you build you need two things: a connected number (see 'Connect Your WhatsApp Number') and an audience of phone numbers (see 'Build Your WhatsApp Audience'). It also helps to know what your number can do in a day: a brand-new number starts at 5 first messages a day and takes about three weeks to reach the full ceiling, so a 500-person list is a multi-week campaign on one number, not an afternoon.

Build the campaign:

  1. Open Campaigns, click 'New campaign', and choose WhatsApp.
  2. Name it and pick the connected number it should send from. Select more than one and WarmySender rotates between them — each keeps its own independent budget, and a given person always stays with the number that first messaged them, so a conversation never appears to jump between senders.
  3. Choose your audience on the Prospects step: a saved list, or numbers pasted in directly for a quick one-off.
  4. Build the sequence. A good first campaign is genuinely short: one message, a wait, and one gentle follow-up.
  5. Review and launch. From there WarmySender paces the sending — there's no send button to press per person.

The four WhatsApp steps:

Note what isn't there: no bulk-blast step, no send-everyone-now button, and no way to remove the pause between messages. WhatsApp works as an outreach channel precisely because it stays 1:1.

What your first message should say: short, specific, personal and easy to reply to — ideally under about three lines. Say who you are and why you're messaging that particular person, ask one easy question, personalize with merge fields so each message genuinely differs, and don't lead with a link or an attachment. Your reply rate isn't only a marketing metric here: if first messages consistently go unanswered, WarmySender automatically tightens how many new conversations that number may start each day.

A/B testing: a Send message step can carry several weighted variants, split across your audience, with each person consistently receiving the same variant throughout the sequence. Because WhatsApp volumes are deliberately small, give a test a couple of weeks before you read it — an opener judged on ten sends will mislead you.

Replies land on the WhatsApp tab of your Inbox, and the moment someone replies their automated follow-ups stop. Replies you receive never count against anything; a reply you type yourself draws from the daily total but is never speed-limited and never counts as a first message. If the same person is also enrolled in your email, LinkedIn or Instagram sequences, a reply on any channel stops the automated follow-ups on the others too.

Group chats: campaigns are strictly 1:1 and never message a group — there's no group step, no way to add a group to an audience, and no setting that turns one on. Groups you're already in appear in your inbox read-only so you can follow along, and you reply to them from WhatsApp on your phone. A message inside a group is never treated as a reply either, so an unrelated group thread can't stop someone's sequence by accident. This is deliberate: unsolicited group messaging is one of the fastest routes to a reported, restricted number.

Read receipts: opening or marking a conversation read in WarmySender only clears your own unread badge — it never sends a read receipt to the other person. Blue ticks still depend on your normal WhatsApp setting and whether you open the chat on your phone. In the other direction, your own outbound messages show their delivered and read state in the inbox whenever the recipient has receipts turned on, which is useful context before you decide whether a follow-up is worth sending.

Standalone or multichannel: WhatsApp can run on its own or as a step inside a multichannel sequence alongside cold email, LinkedIn and Instagram. Each channel keeps its own independent limits, and anyone without a phone number is simply skipped for the WhatsApp steps while the rest of the sequence continues for them. Reserve WhatsApp for people who plausibly expect to hear from you there — it's the most personal channel on the platform, and that's exactly why it works and why it should be used sparingly.

What you can do inside a conversation, from the WhatsApp tab of your Inbox: send files (up to 5 per message, up to 15MB each — photos, PDFs, videos, audio clips — on a campaign's Send message step and on an inbox reply alike, and files people send you are downloadable); record a voice note straight in the reply box, which arrives as a real voice note rather than a file attachment (a reply tool, not a cold-open tool — and if your browser records in a format WhatsApp can't play, WarmySender tells you before anything is sent); react with an emoji, which appears on the other person's phone exactly as if you'd tapped it in WhatsApp; quote a specific message when you reply; edit one of your own sent messages for 15 minutes after it goes out (WhatsApp's window, not ours — after it closes the edit is refused with a plain explanation instead of failing quietly); delete a message for everyone; and pin, mute, archive or mark a thread unread. None of the housekeeping touches a campaign, and none of reacting, editing, deleting or archiving spends any of your daily allowance.

Don't lead with an attachment. An unexpected file to download from an unknown number is a common reason people block a sender; attachments work far better once someone has replied.

Full guide: /documentation/how-to-run-a-whatsapp-campaign

Build Your WhatsApp Audience

WhatsApp outreach works from an audience you bring. Upload a CSV of phone numbers in international format (like +14155550123) on the Prospects page and save everyone to a reusable list, or paste numbers straight into the campaign wizard for a quick one-off.

There is no WhatsApp number search inside WarmySender, and there won't be. WarmySender never scrapes, guesses or harvests phone numbers — your audience is always the numbers you already have. That's also the safest possible starting point for your number: WhatsApp restrictions are driven overwhelmingly by whether the people you message wanted to hear from you, so a small list of people with a real reason to expect your message will outperform, and outlive, a large list of strangers.

Number format — international, with the country code. Beyond that WarmySender is forgiving about punctuation. All of these are read as the same person: '+1 415 555 0123', '(+1) 415-555-0123', '0014155550123' (the 00 international prefix works too), '14155550123', and a 'wa.me/14155550123' link. What doesn't work is a national number with no country code, like '07123 456789' — WarmySender deliberately refuses to guess which country that belongs to, because guessing wrong means messaging a complete stranger. Add the country code and it's accepted. Because everything normalizes to one canonical form, the same person written three different ways across three files stays one person: no duplicates, and nobody gets messaged twice.

Method A — Upload a CSV and save it as a list (best for a reusable, named audience):

  1. Go to the Prospects page and choose Import.
  2. Include a column for each person's number. A simple set of columns is first_name, last_name, phone.
  3. On the mapping screen, map your phone column to the 'WhatsApp Phone' field — this is what makes each person reachable on WhatsApp. Map first_name and last_name to their fields.
  4. Map any extra columns (company, city, how you know them) to custom fields so you can personalize each message.
  5. Save everyone to a named list, for example 'WhatsApp — event follow-ups'.
  6. Open Campaigns > New campaign > WhatsApp and select that list on the Prospects step.

Example CSV (header row, then one row per person):
first_name, last_name, phone
Jane, Doe, +14155550123
Marco, Rossi, +39 340 123 4567
Aisha, Khan, 00447700900123

Method B — Paste numbers into the campaign wizard (best for a quick one-off): the Prospects step lets you paste phone numbers directly, one per line, and WarmySender turns them into your audience on the spot — no file, no import. The same format rules apply, and the same normalization means a number you paste today is recognized as the same person if it also appears in a list you import next week. For anything you'll want to reuse, filter or add to later, import it as a list instead.

What happens to people without a phone number: they're simply skipped for the WhatsApp steps. Nothing errors, nothing pauses, and the campaign keeps running for everyone who does have a number. This is by far the most common reason a WhatsApp campaign reaches fewer people than expected — re-import with the phone column mapped, or paste the missing numbers in, and those people become reachable.

A separate case: someone whose number is perfectly valid but who isn't on WhatsApp at all. Nothing checks a number against WhatsApp before you send, so you find that out when the first message is attempted, and that person is quietly skipped from then on rather than retried. Neither case costs you anything or interrupts anyone else's sequence.

One audience across channels: a single list can carry an email address, a LinkedIn profile, a WhatsApp phone number and an Instagram handle for the same person, so one audience powers a coordinated multichannel sequence. Each channel uses the detail it needs and skips anyone missing it, and a reply on any channel stops that person's automated follow-ups on all the others. Use judgement, though — just because you can add a WhatsApp step for everyone doesn't mean you should. It's the most personal channel on the platform; let email carry the volume.

How big should the list be? Smaller than you'd build for email. One number can start at most 20 new conversations a day — fewer while it's ramping — so a 200-person list is a couple of weeks of outreach on one number.

Full guide: /documentation/how-to-build-your-whatsapp-audience

Do I Need the WhatsApp Business API or Message Templates?

No. WarmySender links to the WhatsApp app you already have — the ordinary app or the WhatsApp Business app, it makes no difference — as a linked device, the same way WhatsApp Web works. There is no WhatsApp Business Platform (the API) to set up, no message templates to write and submit for approval, and no per-conversation fees. You write your message in plain language and it arrives as an ordinary WhatsApp message from your own number.

The three things people mix up:

What WarmySender actually uses: a linked device. Open WhatsApp > Numbers in WarmySender, then on your phone go to Settings > Linked devices > Link a device and scan the code (or type a short pairing code). WarmySender appears in your own Linked devices list, exactly like WhatsApp Web, and you can remove it any time. No password anywhere. Because it is the app path: no message templates, no 24-hour session window to manage, no per-message or per-conversation fees (a flat per-number seat instead — one seat, one number), and no quality rating or tier to climb.

Opt-in applies on every path. Whichever path a business is on, WhatsApp's rules on WHO you may message are the same: the WhatsApp Business Messaging Policy says a business may only contact people once it has 'received opt-in permission from the recipient' confirming they want to hear from you. Messaging a purchased or scraped list of strangers who never opted in is against WhatsApp policy on both the app and the Platform, and it is not what WarmySender is for — it is also the fastest way to lose a number, since restrictions are driven by recipients blocking and reporting far more than by raw volume. Meta's spam policy bars acting 'at very high frequencies', manually or automatically. WarmySender is built to stay the right side of that: genuinely one-to-one, paced, first messages capped, and the cap tightened automatically when first messages aren't earning replies.

Messaging limit tiers are a Platform concept, not WarmySender's. On the Platform, Meta caps how many people a business may START a conversation with per rolling 24 hours (250, 2,000, 10,000, 100,000, then unlimited business-initiated conversations), climbed by high-quality sending. WarmySender uses none of that: its pacing is a fixed, conservative per-number budget — up to 60 messages a day, at most 20 of them first messages, no more than 8 an hour, a natural 45-second-to-2-minute pause, and a multi-week ramp for a new number. Those are ceilings; to reach more people you connect another number.

So: the Business API? No. Message templates? No. The Business app specifically? Optional — the normal app works the same. Opt-in from the people you message? Yes, always — that is a WhatsApp rule, not a WarmySender setting.

Full guide: /documentation/do-i-need-the-whatsapp-business-api-or-message-templates

Prospects & Data

Filter Leads by Postcode, City or Street

Go from a country all the way down to a single neighbourhood using the location filters on the Leads page: Country, then State / Region, then City, then Postcode / ZIP, and finally 'Street contains' under More filters.

City: type it however you like — new york, New York and NEW YORK all match — and common short forms work too, so NYC finds New York. You can add several cities at once (Boston + Chicago + Denver returns contacts in any of them). Pair City with Country, because city names repeat around the world.

Postcode / ZIP: matches from the START of the code, so the amount you type sets how wide the area is. Type 100 and you get every ZIP beginning 100 (a large slice of Manhattan); type 10001 and you get just that one; type M5V and you get that part of downtown Toronto. Available for United States and Canada contacts. Not every contact carries a postcode, so combine it with City or State / Region rather than using it alone.

Street contains: under More filters, matches the words you type anywhere inside a contact's street address — ideal for a named office tower, a business park, or a single avenue (type Yonge and you get addresses on Yonge Street). Keep the phrase short and distinctive. United States and Canada.

Checking deliverability: there is no verification filter on the lead database — it's a directory of contact details, not a live check of whether a mailbox will accept mail today. Build your list, Save to List, and then run that saved list through the Email Verifier before you launch. See /documentation/what-email-verification-results-mean.

Did you mean...?: when a keyword looks misspelled or a search returns very few matches, a suggestion appears above the results — click it and the search re-runs corrected. Check this first whenever a count looks surprisingly low.

What isn't supported yet: there is no radius ('within X miles') search — the closest equivalent is a shorter postcode prefix — and there is no postcode data for the United Kingdom or Australia, so use City and State / Region in those markets.

An AI agent connected to your account can use the same filters under the same names (postalCode, address) in plain language, and can verify a saved list for you before you launch.

Full guide with worked examples: /documentation/how-to-filter-leads-by-postcode-city-and-street

Managing Prospects & Contacts

Prospects are your campaign contacts, managed from the Prospects page:

Global Statuses:

Adding Prospects:

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:

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:

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.

Use Your Existing Contacts in a New Campaign

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):

2) Save contacts to a list, then pick that list:

3) Re-import a CSV into a list (no duplicates, and your custom fields fill in):

'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'.

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:

Use the Contacts view to manage ongoing relationships and follow up with engaged prospects outside of automated campaign sequences.

Prospect Lists & Campaign Creation

Prospect Lists help you organize contacts and streamline campaign creation:

Creating Lists:

Using Lists for Campaigns:

List Management:

Import to Lists:
When importing via CSV, you can choose to add imported prospects to an existing list or create a new one during the import wizard.

Best Practices:

Edit a Contact's Fields, Tags and Custom Fields

Everything on a contact can be changed after it is saved — not just the email address and the name. Open the Contacts page, find the person, click the three-dot menu at the end of their row and choose Edit. The window that opens has the same full set of fields you get when you add a contact by hand.

What you can change
Contact: Email, First Name, Last Name, Company, Role/Title, Website.
Channels: Phone, LinkedIn URL, WhatsApp Phone (include the country code), Instagram Username or URL (paste the full link or just the handle).
Details: Country, City, Industry, Tags.
Custom Fields: anything else you want to keep about this person.

Change what you need and click Save Changes. Leaving a field blank clears it. Nothing is restarted and nothing is re-sent — the contact keeps its history, its lists and its exact place in every campaign, and the new details are used from its next step onwards.

Tags
Type tags separated by commas, for example: vip, warm-lead, q4. What you save replaces the whole tag set rather than being added to it, so type the full list you want the contact to end up with. Clearing the box removes every tag from that contact.

Custom fields
Click 'Add Field' to create a brand-new custom field on the spot — it does not have to have come from an import. Each row is a field name and a value, and the x at the end of a row removes that field from the contact. Other custom fields on the same contact stay put. Field names are lowercased and anything that is not a letter, number or underscore becomes an underscore, so 'Recent Award' is saved as recent_award. Use the field in your emails as {{custom.recent_award}} and every recipient gets their own value. Tags and custom fields work differently on purpose: tags you save replace the whole list; changing one custom field leaves every other custom field as it was.

Changing the email address
You can, but if another contact in your account already uses that address the save is refused and we name the address so you can update or remove the other contact first. That stops two genuinely different people — each with their own lists, campaigns and reply history — from being merged by accident.

Ask an AI agent instead
An AI agent connected to your account can change the same fields in plain language: 'Set Acme's industry to SaaS and tag them vip', or 'Add a custom field called recent_award with the value Best New Tool'. Adding one custom field does not remove the others. The email address is the exception and stays an in-app change. Editing details cannot make a bounced or unsubscribed address mailable again. As always, an agent never sends a message, DM or invite itself and can never raise a limit — WarmySender's scheduler paces every action inside safe limits and the gradual ramp no matter who asked for it. The same fields are available through the public API.

Many contacts at once
The Edit window handles one contact at a time. For many, select contacts on the Contacts page and use the bulk actions, or re-import a spreadsheet containing the same email addresses — that updates the contacts already on file instead of creating duplicates.

FAQ:
Q: Why did my old tags disappear when I edited tags?
A: The tags you save replace the whole set. Type the full list you want, separated by commas — 'vip, q4' rather than just 'q4'.

Q: Can I add a custom field that did not exist before?
A: Yes. Click 'Add Field' in the Custom Fields section, type a name and a value, and save. Names are lowercased with underscores instead of spaces.

Q: How do I use a custom field in an email?
A: Write {{custom.field_name}} in the subject or body, using the name exactly as saved.

Q: If I only change one custom field, do the others disappear?
A: No. Changing one custom field leaves every other custom field on that contact as it was. Tags work the other way: the list you save is the whole list.

Q: How do I clear a field?
A: Leave it blank and save — an empty field clears the stored value.

Q: Will editing a contact restart or re-send a campaign?
A: No. The contact stays exactly where it is in every sequence, and new details are used from the next step onwards.

For the full walkthrough, see /documentation/edit-a-contacts-fields-tags-and-custom-fields.

Remove From a List vs Delete a Contact

There are two ways to take a contact out of your way, and they do very different things. Picking the right one takes a second and saves a lot of rework.

Remove from this list
This takes the contact off the list you are currently looking at, and nothing else. The contact stays in your account, stays on every other list it belongs to, and keeps all of its history. Use it whenever you are tidying up a list.

Where to find it: open the Contacts page, click a list in the sidebar on the left so that list is in view, then either use the three-dot menu on a row and choose 'Remove from this list', or tick several contacts and click 'Remove from list' in the bar that appears at the top.

This option only appears when a list is open, because 'this list' has no meaning in the all-contacts view.

Delete contact
This is the stronger action. It takes the contact out of every list, and stops it in every campaign it is currently part of — any email that was queued for that person is cancelled. What it keeps is the history: replies, bounces and the record that you had already reached out. That is on purpose, and it is what keeps the 'do not contact the same person again too soon' rule working, and what stops an address that once bounced from quietly being emailed again after a re-import.

Where to find it: the three-dot menu on a row, or the red button in the bar when you have contacts selected. Both ask you to confirm first, and the confirmation says exactly what will happen.

A worked example
Say Maria is on two lists: 'SaaS founders' and 'Webinar signups'. You are cleaning up 'SaaS founders' and she does not belong there.

Which one frees up space on your plan
Only deleting does. Removing a contact from a list just unfiles it — the contact is still in your account and still counts toward your contact limit. If you are trying to make room, delete the contacts you do not need, or move to a plan with a larger limit.

If you delete someone by mistake
Import them again. Uploading a list that contains the same email address brings the contact back, along with the details already on file, and re-files it into whichever list you import into. The contact counts toward your limit again, so it needs a free slot.

One thing that does NOT come back: if the contact had unsubscribed, bounced, or was on your do-not-contact list, it stays that way after re-importing. Re-importing someone never makes an unsubscribed address mailable again.

FAQ:
Q: What is the difference between removing a contact from a list and deleting it?
A: Removing takes the contact off the one list you have open and changes nothing else — it stays in your account, on its other lists, and in its campaigns. Deleting takes it off every list and stops it in every campaign.

Q: Does deleting a contact erase its replies and bounces?
A: No. That history is kept on purpose, so the rule that stops you contacting the same person again too soon keeps working, and so an address that bounced is not quietly emailed again later.

Q: Does removing a contact from a list free up space on my plan?
A: No — the contact is still in your account and still counts. Deleting is what frees a slot.

Q: I deleted a contact by mistake. Can I get it back?
A: Yes. Import a list containing the same email address and the contact comes back with the details already on file. It counts toward your limit again, so you need a free slot. If the contact had unsubscribed or bounced, it stays that way.

Q: Why do I not see 'Remove from this list'?
A: You are in the all-contacts view. Click a list in the sidebar on the left first, then the option appears in the row menu and in the bulk bar.

For the full walkthrough, see /documentation/remove-from-a-list-vs-delete-a-contact.

Why Is My Contact Count Higher Than My Lists?

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.

CSV Import (Advanced Guide)

Detailed guide for importing prospects via CSV:

Supported Columns:

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:

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:

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

Leads Database (B2B Contacts)

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:

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:

Accessing Leads:

Search Filters:

Lead Data Available:

Monthly Leads by Plan:

Daily Pace (your monthly leads, spread across the month):

What a Lead Costs (browsing is free):

Lead Credits (keep going past today's limit or your monthly allowance):

Saving & Exporting:

Creating Campaigns from Leads:

  1. Save leads to a prospect list
  2. Go to the 'Saved Leads' tab
  3. Select your list and click 'Create Campaign from List'
  4. This navigates to the campaign wizard with the list pre-selected

What File Formats Can I Upload for Email Verification?

Upload a CSV (.csv) or a plain-text list (.txt or .tsv), in upper or lower case — LEADS.CSV works exactly like leads.csv. In practice almost any spreadsheet export works as it comes out of the app that made it.

You do NOT need a column called "email". Every column of every row is scanned and the addresses are picked out wherever they sit, so the column can be called Work Email, Corporate Email, Primary Email, Email 1, something in another language, or nothing at all. It does not have to be the first column, and you do not need to delete your other columns first. A header row is optional, and a title line above the real header is skipped.

Separators are detected for you — comma, semicolon, tab or pipe. The semicolon case catches people out and is not their doing: saving as CSV in Excel produces a semicolon-separated file across much of Europe, and it is still a valid CSV. Upload it exactly as Excel saved it. Accented and non-English characters read correctly, including Excel's "Unicode Text" save, and a line break inside a cell stays in its cell instead of being read as a new row.

Limits: up to 5,000 addresses per file and up to 7 MB per file, one file at a time. For a bigger list, split it into files of 5,000 or fewer and upload them one after another — every file lands in the same place, so nothing is lost by splitting.

A file runs in full on the day you upload it, or not at all. Before anything is charged, we check the whole file against what you can verify today — your plan's remaining daily allowance plus any verification credits you hold. If the file is bigger than that we refuse it, tell you exactly how many you can verify today, and charge nothing and store nothing: trim the file to that number, or add verification credits (they never expire and skip the daily pace) and run it straight away. If it fits, the whole file runs.

Duplicates are removed automatically before anything is checked, so the same address is never verified or charged twice and you never need to de-duplicate first.

If it says no email addresses were found, the message tells you how many rows were read — a row count means the file read fine but the addresses were not in it; "the file looks empty" means no rows at all. It will never tell you to add an "email" column, because every column is checked. Workbooks (.xlsx), documents and PDFs need saving as CSV first.

Every failed-upload message ends with a short reference code. Quote it in an email to us and we can look up that exact attempt. Nothing is charged when an upload is refused, and your list is untouched.

Full explainer: /documentation/what-file-formats-can-i-upload-for-email-verification

Does Email Verification Keep My Contact Names, Companies and Custom Columns?

Yes. When you upload a file to the email verifier, the results download contains every column from that file — names, companies, job titles, phone numbers, notes, tags, custom fields — placed after the verification columns, with your header names and column order kept. Upload your export exactly as it comes out of your spreadsheet or CRM; there is nothing to strip out first and nothing to merge back afterwards.

A file without a header row comes back with columns named column_1, column_2 and so on. If one of your headers happens to match a verification column name, yours is renamed with an "_original" ending so nothing is overwritten. Duplicate addresses are checked once and return the first row they appeared on.

Results downloaded BEFORE this improvement contain only the verification columns, and re-downloading an old run does not add columns — the original rows were not kept at the time. The fix there is a two-minute lookup on the email column: put the results on a second sheet and use =XLOOKUP(A2, Results!A:A, Results!B:B, "not checked") in your original file (or =VLOOKUP(A2, Results!A:B, 2, FALSE) in older Excel — the email is the first column of every results file, which is exactly what the formula wants).

Addresses submitted one by one by an AI agent, or a verification run on an existing prospect list, have no uploaded file to preserve — your prospect list itself keeps all its fields regardless.

Full explainer with the merge steps for Excel and Google Sheets: /documentation/does-email-verification-keep-my-contact-data

Email Verification Limits & Credits

The complete guide to how your verification allowance works. Every plan includes a monthly number of verifications plus a smaller daily allowance (the monthly total divided by 30) that paces those checks across the day — and a verification has to fit within both. The monthly allowance refreshes at the start of each month and does not roll over; the daily one refreshes every day.

One credit verifies one address. Unknown results are free and never count against either allowance, so your usable allowance usually stretches further than the headline number.

Your plan's number is an ALLOWANCE, NOT A CEILING: purchased credit packs verify beyond it, never expire, and skip the daily pace. And you do not need a plan at all — anyone can run a free single check each day with no sign-up, and credits can be bought on their own (see /documentation/email-verification-limits-and-credits).

Also covers: how to see what you have left, what happens when you reach either limit, why a list can finish with 0 verified, running several lists at once, the per-file upload cap, and turning your results into a campaign-ready list.

Full explainer: /documentation/email-verification-limits-and-credits

Can I Verify a Big List All at Once?

Short answer: yes, with purchased credit packs. A plan's included monthly verifications are spread across the month at a gentle daily pace, deliberately, so results stay accurate. Credit packs are not on that pace and never expire, so you can point them at a large list and verify it in one batch the same day. You do not need a plan to buy them.

Verifying while your campaigns are running is safe. Undeliverable addresses are automatically skipped, so cleaning your list mid-campaign only improves what is about to go out — and verifying a contact never re-enrolls them or resets their place in a sequence, so nobody is emailed twice.

This page compares the two pools side by side and walks through cleaning a big list right now.

Full explainer: /documentation/email-verification-credits-and-daily-limits

Do I Need to Verify My List Before I Send?

Short answer: yes — unless you collected the list yourself in the last few weeks. Lists go stale on their own while the spreadsheet sits untouched, and a dead address looks exactly like a live one.

Why it happens: people change jobs and their work address is switched off; companies merge, rebrand or close and the whole domain stops accepting mail; some addresses were typos or pattern guesses that never worked at all.

What it costs to skip it: mail providers judge the mailbox you send from, not each message. When too many messages bounce, your good emails to real people start landing in spam too — and your own provider may pause your sending. Verifying takes minutes; rebuilding a damaged sending reputation takes weeks.

What to do with the results: send Valid first, include Risky (catch-all) and Unknown with warmup running on your mailbox, and leave Invalid out — WarmySender does that for you automatically. An Unknown result means no answer was possible, not that the address is bad, and it does not count against your monthly allowance.

Full explainer: /documentation/do-i-need-to-verify-my-list-before-i-send

What Your Email Verification Results Mean

Your verification results come back as one of four answers. Here is what each one means and what to do with it.

Valid — the mailbox was confirmed to exist and can receive mail. Send with confidence; these are your best addresses.

Risky — almost always a catch-all domain, one set to accept mail for every address. The domain is live, but no tool can single out whether that one mailbox exists. Many risky addresses are perfectly deliverable; send them with warmup running on your mailbox.

Unknown — we could not confirm the address either way. It does NOT mean the address is bad: some large, security-conscious receiving systems deliberately answer everyone the same way. Unknown results are always free and never use a credit, and these addresses are usually safe to email with warmup on.

Invalid — the address does not exist or cannot receive mail. Skip it. These are the ones that bounce, and bounces are what damage your sender reputation.

Some results are also backed by real delivery history — if your own mail has reached that inbox before, that is first-hand proof and is marked 'Real delivery' in your results.

Full explainer: /documentation/what-email-verification-results-mean

Use Your Verified List in a Campaign (No Duplicates)

When a verification finishes you do not have to download the results and re-upload a trimmed spreadsheet. WarmySender gathers the good addresses into a NEW list named after your original with '- Verified' on the end, and you point a fresh campaign straight at it.

Nothing is duplicated. The verified list is created alongside your original — nothing is moved, merged or overwritten, and no existing campaign is edited — so there is no way for someone to be contacted twice. Anyone already in your account is reused rather than added again, and addresses that came back invalid are kept out of sending automatically.

Verified a CSV upload instead of a saved list? A 'Create clean list' button builds the very same campaign-ready list. Want Valid (confirmed) only, without Risky mixed in? Filter the results to Valid and save that view as its own list. And every finished run has a Download option if you would rather work in a spreadsheet — Download matches the filter you are looking at.

Full explainer: /documentation/apply-verified-list-to-campaign-without-duplicates

Save Only Confirmed Emails From Verification

The default clean list after verification includes Valid and Risky together, because many catch-all addresses still deliver. If you want confirmed mailboxes only, open the finished run, filter to Valid, and click Save Valid as a list. That creates a separate list; it does not replace the automatic campaign-ready list. Download follows the same on-screen filter. Your agent can do this too — ask for confirmed addresses only; if you do not specify, it still builds the campaign-ready mix.

Full explainer: /documentation/how-to-save-only-confirmed-addresses-from-verification

How Do I Get Email Addresses for My Contacts?

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.

Why Do Verified Emails Still Bounce?

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:

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:

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.

Data Hygiene & List Cleaning

Clean data is the foundation of successful outreach. Poor data quality causes bounces, spam complaints, and reputation damage.

Why Data Hygiene Matters:

Before Importing (Pre-Import Cleaning):

  1. Remove obvious junk — blank rows, test entries, personal emails (gmail.com, yahoo.com for B2B campaigns).
  2. Standardize formatting — consistent name capitalization, remove extra spaces.
  3. Verify email format — every email must contain @ and a valid domain.
  4. Remove role-based emails — info@, sales@, support@, admin@ have high bounce and complaint rates.
  5. Check for suppressed domains — remove emails from domains on your blocklist.

Using WarmySender's Built-in Tools:

Ongoing Maintenance:

Bounce Shield — already on, nothing to enable:
• Campaigns pause themselves when bounce rates go above their limit (5% by default), once there are at least 50 sends to judge on.
• Bounced addresses are added to your blocklist automatically and no campaign emails them again.
Neither of those can be switched off — they run on every campaign in every workspace. What Settings → Bounce Shield adds is a STRICTER limit of your own, applied across the workspace (we always use whichever is lower, so it can only tighten protection), plus an email to the workspace owner when a campaign is paused. Why a campaign paused and how to clean the list before resuming: warmysender.com/documentation/why-did-my-campaign-pause-for-bounces

Best Practices:

Advanced Custom Fields Guide

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:

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:

Segmentation with Custom Fields:

If a Tag Isn't Recognised:
A tag that matches no built-in field and no custom field sends as EMPTY — it is never printed literally in the email. Before you launch, the pre-launch check lists every unrecognised tag by name so you can fix or remove it. It also spots square-bracket placeholders carried over from other tools ([company], [first name], [[FirstName]]) and offers a one-click fix that converts each into the matching WarmySender merge tag — square brackets are not merge tags here, so left alone they go out exactly as typed.

Limitations:

Best Practices:

Integrations

Webhooks — Getting Started

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:

All events use the same envelope: { type, data, timestamp }.

Creating a Webhook:

  1. Settings → Webhooks → New webhook.
  2. 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.
  3. Pick events. Start with reply.received + linkedin.reply_received + linkedin.invite_accepted for sales teams; add email.bounced + limit.hit for ops.
  4. Save. WarmySender returns a webhook secret — save it somewhere secure, you'll need it to verify signatures. The secret is shown once.
  5. 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. If your endpoint asks us to slow down and says how long to wait — as a number of seconds or as a date — we honour that wait, capped at our maximum 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:

Troubleshooting:

Related Guides: 'Slack Notifications' (native, no middleware), 'n8n Integration', 'Zapier Integration', 'Make Integration', 'HubSpot CRM Integration'.

HubSpot CRM Integration

Connect WarmySender to HubSpot CRM to automatically sync prospect activity and campaign data.

What This Integration Does:

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:

Best Practices:

Salesforce Integration

Connect WarmySender to Salesforce to sync campaign activity and create leads automatically.

What This Integration Does:

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:

Best Practices:

Pipedrive Integration

Connect WarmySender to Pipedrive to sync prospect activity and manage your sales pipeline.

What This Integration Does:

Setup Option 1: Direct Webhook

Step 1: Create a handler endpoint
Build a server or serverless function that receives WarmySender webhook events.

Step 2: Configure in WarmySender
• Settings > Webhooks > Create Webhook.
• Enter your endpoint URL.
• Subscribe to: reply.received, email.opened, email.clicked, email.bounced.

Step 3: Map events to Pipedrive
• reply.received → Search Person by email, create if not found, create Deal in first pipeline stage, add Activity (type: 'email', subject: 'Prospect replied')
• email.opened → Add Activity (type: 'email', subject: 'Email opened')
• email.clicked → Add Activity, move Deal to 'Interested' stage
• email.bounced → Update Person, mark Deal as Lost (reason: 'Invalid email')

Pipedrive API Basics:

Setup Option 2: Via Zapier
Use Zapier Webhooks (Catch Hook) trigger + Pipedrive actions. No code required.

Best Practices:

Connect WarmySender to Zapier

Yes — WarmySender connects to Zapier without a branded app, using Zapier's generic modules. Three shapes:

Included on every paid WarmySender plan, including the AppSumo lifetime tiers.

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:

  1. Reply received → Create HubSpot deal + Notify Slack channel
  2. Email bounced → Update Google Sheet row + Remove from Mailchimp list
  3. Link clicked → Create Pipedrive activity + Send Slack DM to sales rep
  4. Prospect suppressed → Update Airtable record

Tips:

Connect WarmySender to Make

Yes — WarmySender connects to Make (formerly Integromat) without a branded app, using Make's generic modules. Three shapes:

Included on every paid WarmySender plan, including the AppSumo lifetime tiers.

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:

Best Practices:

Connect WarmySender to n8n

Yes — WarmySender connects to n8n in three ways, and none of them needs a plugin or a community node. Works on self-hosted n8n and n8n Cloud, on every paid WarmySender plan including the AppSumo lifetime tiers.

1) Let an n8n AI Agent run your outreach (MCP Client Tool node)
• Add an AI Agent node with any chat model, then attach an MCP Client Tool node to its Tool input.
• Endpoint: https://warmysender.com/mcp, Server Transport: HTTP Streamable (the default on current n8n; older versions defaulted to the deprecated server-sent-events option, which shows 'Could not connect to your MCP server' — switch it).
• Authentication: Bearer Auth, with a WarmySender API key (Settings → API Keys, starts with ws_) as the token.
• Tools: 'All' to start, or 'Selected' to hand the agent only the tools you want — the list loads from WarmySender, which doubles as your connection test.
• Ask it: "List my campaigns and tell me which ones sent nothing yesterday." It can build, launch, pause and report on campaigns, add prospects, verify emails and tune warmup — and it never sends a message itself and can never raise a limit; the scheduler paces everything.

2) Call WarmySender from any workflow (HTTP Request node)
• Authentication: Generic Credential Type → Header Auth. Name: Authorization. Value: Bearer ws_… (store it as a credential, never in a field).
• Most common call: POST https://warmysender.com/api/v1/prospects with Send Body → JSON, e.g. { "email": "{{ $json.email }}", "firstName": "{{ $json.firstName }}", "enrollInCampaignId": "YOUR_CAMPAIGN_ID" } — creates (or merges) the prospect and enrolls them in one request.
• Every other call is in the API reference at /docs/integrations (also published as an OpenAPI file at /api/v1/openapi.json).

  1. Get replies, bounces and accepted invites INTO n8n (Webhook node) — the steps below.

Why n8n:

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:

  1. On the Webhook trigger node, under 'Options', enable 'Raw Body' so the raw bytes are preserved on `$binary.data`.
  2. 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.

LinkedIn Event Payload Shape:
linkedin.reply_received:
data: { prospectId, prospectName, prospectLinkedinUrl, campaignId, enrollmentId, linkedinAccountId, messageText, threadId, receivedAt }
linkedin.invite_accepted:
data: { prospectId, prospectName, prospectLinkedinUrl, campaignId, enrollmentId, linkedinAccountId, acceptedAt }

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:

Best Practices:

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.

Slack Notifications (Native — No Middleware)

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:

Setup (5 minutes, no code):

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:

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:

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.

Reliability:

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.

Google Sheets Integration

Automatically log WarmySender campaign events to Google Sheets for reporting and analysis.

What This Integration Does:

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:

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:

Best Practices:

GoHighLevel (GHL) Integration

Connect WarmySender to GoHighLevel (GHL) for agency CRM sync and lead management.

What This Integration Does:

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:

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):

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):

Best Practices:

Airtable Integration

Connect WarmySender to Airtable to build a custom engagement tracking database.

What This Integration Does:

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:

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:

Best Practices:

MCP Server — Connect AI Tools (Overview)

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:

What You Cannot Do (by design):

Supported AI Clients:

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):

Rate Limits (per workspace, per minute):
Read, write, LinkedIn and bulk limits scale with your plan — for example Lite is 15 reads / 5 writes / 3 LinkedIn / 1 bulk per minute, and Business is 120 / 30 / 10 / 5. The AI Agents page (/ai-agents) lists every plan side by side.

Email verification has its own ceiling that is the SAME on every plan: 20 single checks per minute and 5 runs started per minute. Your plan sets how much you can verify, not how fast — this one protects delivery accuracy for everyone.

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 65 tools. See "MCP Server — Safety, Scopes, and Rate Limits" for security and limits deep-dive.

Full dedicated reference: warmysender.com/mcp

MCP Server — Install in Claude Desktop / Claude Code / Cursor / Windsurf / Zed

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:

  1. Go to Settings > API Keys > Create API Key.
  2. Name it (e.g., "Claude Desktop" so you can revoke per-client later).
  3. 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.
  4. 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):

{
"mcpServers": {
"warmysender": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://warmysender.com/mcp",
"--header",
"Authorization: Bearer ws_YOUR_API_KEY_HERE"
]
}
}
}

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:

claude mcp add warmysender --transport http https://warmysender.com/mcp --header "Authorization: Bearer ws_YOUR_API_KEY_HERE"

Verify with: claude mcp list — you should see warmysender. Restart any active claude session to pick up the change.

Cursor:
Open your project's.cursor/mcp.json (or ~/.cursor/mcp.json for global) and paste:

{
"mcpServers": {
"warmysender": {
"url": "https://warmysender.com/mcp",
"headers": {
"Authorization": "Bearer ws_YOUR_API_KEY_HERE"
}
}
}
}

Restart Cursor. Open the Cursor Settings > MCP tab to confirm warmysender is listed and connected.

Windsurf (Codeium):
Edit ~/.codeium/windsurf/mcp_config.json:

{
"mcpServers": {
"warmysender": {
"serverUrl": "https://warmysender.com/mcp",
"headers": {
"Authorization": "Bearer ws_YOUR_API_KEY_HERE"
}
}
}
}

Restart Windsurf.

Zed:
Zed uses stdio so we bridge with mcp-remote. Open Zed settings (Cmd+,) and merge into your settings.json:

{
"context_servers": {
"warmysender": {
"command": {
"path": "npx",
"args": [
"-y",
"mcp-remote",
"https://warmysender.com/mcp",
"--header",
"Authorization: Bearer ws_YOUR_API_KEY_HERE"
]
}
}
}
}

Restart Zed.

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.

Manual curl Test (from your terminal):

curl -X POST https://warmysender.com/mcp \
-H "Authorization: Bearer ws_YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'

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:

See also: "MCP Server — Available Tools Reference" and "MCP Server — Safety, Scopes, and Rate Limits."

MCP Server — Available Tools Reference (65 tools)

The WarmySender MCP server exposes 65 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:

Prospects:

Enrollments & suppression:

TRACKING DOMAINS — 4 tools (use your own branded domain for open/click tracking):

LINKEDIN — CAMPAIGNS, POSTS & RECRUITER — 18 tools (safety-gated, scheduler-paced):

Campaigns:

Posts:

Recruiter:

Read:

INSTAGRAM DMs — 9 tools (safety-gated, scheduler-paced):

WARMUP & MAILBOXES — 5 tools:

EMAIL VERIFICATION — 7 tools (same safe pacing and allowance as the in-app verifier):

LEADS DATABASE — 3 tools:

WORKSPACE & JOBS — 2 tools:

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

MCP Server — Safety, Scopes, and Rate Limits

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:

Revoking takes effect immediately — Settings > API Keys > Delete. The AI client's next call gets 401.

RATE LIMITS (per workspace, sliding 60-second window):

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:

DATA THE AI NEVER SEES:

RED-TEAM TESTS WE RAN:

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."

Connect WarmySender to Grok Bot (Custom MCP Connector)

Grok supports custom MCP connectors and WarmySender speaks MCP, so you can add your workspace to Grok and run outreach in plain language. The server lives at https://warmysender.com/mcp and is already public (Grok's one requirement), so there is nothing to install or tunnel — you paste a URL and a key.

Who Can Use Grok Bot Today:
Grok Bot runs each of its agents on a cloud computer of its own, and ships as a desktop app for macOS and Windows (there is no Linux desktop app), plus iOS. On 26 August 2026 xAI widened access to SuperGrok and Cursor subscribers and reset weekly usage limits for everyone, so far more people can now put an agent to work. The qualifying tiers moved with that announcement, and xAI's own docs list them more narrowly than the announcement did — so check xAI's Grok Bot get-started page for the current list before you buy anything. (Grok Bot comes bundled with those paid subscriptions; it is not a free product.) Whichever way you reach Grok, the WarmySender connection below is the same.

Step 1 — Create Your API Key:
In WarmySender: Settings > API Keys > Create API Key. Name it "Grok", pick the scopes Grok should have (*:read only for monitoring; add the *:write scopes for full automation), and copy the key — shown once, starts with ws_.

Step 2 — Add the Custom Connector in Grok:
xAI documents this on the Grok web app: go to grok.com/connectors, click New Connector, select Custom, enter https://warmysender.com/mcp as the MCP server URL, and complete authentication with your ws_ key as the bearer token. On Grok Business and Enterprise, admins instead use the xAI console: + Add Connector > Other > same URL. Per xAI's docs, Grok then discovers the server's tools and makes them available in conversations. This is the route xAI documents for a custom MCP server, and connectors install account-wide rather than per-Bot — so once it is added here, Grok Bot sees it too.

Step 3 — Test:
Ask Grok: "Use the get_workspace_info tool to show me my WarmySender workspace." A reply with your workspace name, tier, and scopes means you're connected.

Using Grok Bot?
Grok Bot keeps its add-ons under Settings > Plugins — that is where installed connectors appear, and in a chat you type @ to attach one to the task. The Plugins page is also a catalogue you can browse, and WarmySender is not in that catalogue yet; our submission is in progress and we will update this guide the moment it appears. Two routes work today:
• Add the custom connector on grok.com exactly as in Step 2 above. It attaches to your Grok account, so your Grok Bot conversations can call the WarmySender tools.
• Running Grok Bot through Cursor? Add WarmySender to Cursor's own MCP configuration instead, using {"type": "http", "url": "https://warmysender.com/mcp"} with your ws_ key as the bearer token. That exact configuration is tested and working end to end. Per-client snippets for Cursor and every other tool: /documentation/mcp-install.

What Grok Can Do:
Run campaigns on cold email, LinkedIn, and Instagram (create/start/pause/resume/enroll, scheduler-paced within your safe caps and ramp), verify emails, search and export B2B leads, read mailbox health, tune warmup, and manage suppressions and tracking domains.

What Grok Can NEVER Do:
Send a message directly (launching only hands the campaign to the scheduler, which paces everything no matter who triggered it), raise a limit, connect or disconnect accounts, or delete anything permanently.

Troubleshooting:
Auth fails — the key must start with ws_ and not be revoked. "Insufficient scope" — add that scope to the key. Rate limited — wait a minute. Revoke any time by deleting the "Grok" key.

See also: "MCP Server — Connect AI Tools (Overview)" and "MCP Server — Safety, Scopes, and Rate Limits".

Automatically email new leads from a form or popup

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.

Step 3 — Send the request
POST https://warmysender.com/api/v1/prospects
Headers:
Authorization: Bearer ws_YOUR_API_KEY_HERE
Content-Type: application/json
Body:
{
"email": "[email protected]",
"firstName": "Jane",
"lastName": "Doe",
"company": "Acme",
"enrollInCampaignId": "YOUR_CAMPAIGN_ID"
}

Copy-paste curl 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":"Jane","lastName":"Doe","company":"Acme","enrollInCampaignId":"YOUR_CAMPAIGN_ID"}'

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:

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:

Related Guides: 'Managing Campaigns via API', 'API Quickstart Tutorial', 'Zapier Integration', 'Make (Integromat) Integration', 'n8n Integration (Self-Hosted)'.

Add leads from a website form or popup (and auto-start a campaign)

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:

Step 1 — Create an API key:

Step 2 — Find your list ID:

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)'.

Managing Mailboxes With the API

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

SEO & Content

Why isn't my page indexed on Google?

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).

SEO

SEO and Indexing FAQ — How WarmySender's pages get indexed

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 instead of the page's own title and description, because the meta tags on the browser path couldn't override the site-wide 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.

Performance

Page Speed and Performance — How WarmySender stays fast

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:

  1. 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.
  1. 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.
  1. 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.
  1. 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.

Billing & Plans

How to Cancel Your Subscription or Delete Your Account

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.

Upgrading or Changing Your Plan (Proration Explained)

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.

What Happens to My Account When a Payment Fails

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:

  1. 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.
  2. 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.
  3. 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

Why Is My Campaign Paused After a Payment Issue

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

I Paid but My Plan Hasn't Changed Yet

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:

  1. 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.
  2. 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.
  3. 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

How to Redeem Your AppSumo Code

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):

  1. 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.
  2. 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.
  3. 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.
  4. 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: Lifetime tiers are changed on AppSumo, not by adding codes: open Products in your AppSumo account and choose Change plan from WarmySender's Actions menu. Upgrades are available while the deal is live on AppSumo, and you can move down a tier within 60 days of purchase. 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.

When Do Affiliate Referrals and Earnings Show Up?

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 Do I Switch My LinkedIn Seats to Annual Billing?

Yes — you can move LinkedIn seats you already own onto annual or 3-year billing whenever you like, and you can add more seats on a longer term in the same step. Nothing is cancelled, you keep every seat you have, and your connected LinkedIn accounts are not touched.

What each term costs, per seat:

A worked example. Say you have 5 LinkedIn seats billed monthly. At $12 each that is $60 a month, or $720 across a year. Move those same 5 seats to annual and you pay $600 for the year — a saving of $120. Put them on the 3-year term instead and you pay $1,440 for three years, against $2,160 if you stayed monthly — a saving of $720.

How to switch:

  1. Open Billing.
  2. Find your LinkedIn seats card — the one showing how many seats you have.
  3. Choose Monthly, Annual or 3 Years.
  4. Check the Now and After figures we show you before you commit. They are your real numbers, not a generic price list.
  5. Confirm. The change is live straight away.

Adding seats and changing term at the same time. You do not have to do these one after the other. Going from 1 monthly seat to 5 annual seats is a single step and a single charge — set the number of seats you want and the term you want them on, and confirm once.

You are never charged twice for the same days. When you switch, the unused time left on your current seats is worked out and credited against the new charge, so you only pay the difference. If that credit is larger than the new charge — which can happen moving from a longer term to a shorter one — there may be nothing to pay at all.

One rule to know: a seat term can never be longer than your plan's term. Seats are only useful alongside an active plan, so we do not let you prepay for seats past the end of the plan they depend on:
• On a monthly plan, seats bill monthly.
• On an annual plan, seats can bill monthly or annually.
• On a 3-year plan, seats can bill monthly, annually or every 3 years.
If the term you want is not offered, move your plan to that term first and the seat options open up.

A few honest details:

Still unsure which term is right? Annual is the sensible default if you expect to run LinkedIn outreach for the next year, and the 3-year term is worth it if you are settled on how many seats your team needs. If you are still testing, stay monthly — you can move up at any time.

Full explainer with worked examples: /documentation/how-do-i-switch-my-linkedin-seats-to-annual-billing

Mailbox Limits Per Plan

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.

Full explainer: /documentation/mailbox-limits

Warmup

How Your Warmup Daily Volume Is Decided

Your warmup target is what you are aiming at; today's volume is what the mailbox has actually earned. A brand-new sending domain starts at one warmup email a day and climbs on a gradual curve to 40 a day around the sixth week of sending. A mailbox that is at least 14 days old, has at least 7 days of real sending behind it, keeps spam placement under 2% and bounces under 1%, and has moved to maintenance warmup earns its full configured target — up to 120 a day, which is the highest warmup volume we run for a single mailbox. Whenever today's number is lower than your target, WarmySender names the exact reason on the mailbox.

Target vs daily volume. The target is the number you set in warmup settings: where you want the mailbox to end up. The daily volume is what warmup will actually send today. They differ on purpose — a brand-new address that suddenly sends at full volume is exactly the pattern mailbox providers filter. The target is also a ceiling: set it to 10 and warmup will never send more than 10, however long it runs.

The curve, week by week, for a new domain at normal ramp speed with a target of 40. "Week" means a week of sending days, not calendar days — the ramp only advances on days the mailbox actually sends.
• Week 1 (sending days 1-7): 1 rising to 7 a day.
• Week 2 (days 8-14): 9 rising to 15 a day.
• Week 3 (days 15-21): 15 rising to 21 a day.
• Weeks 4-5 (days 22-35): 23 rising to 35 a day.
• Week 6 onward (day 36+): 40 a day — full speed for a new domain.

Starting volume and ceiling by warmup mode:

Ramp speed changes the size of each step, not the destination: conservative raises volume by at least 1 every two sending days, normal by at least 2, aggressive by at least 3. Aggressive does not raise the ceiling — it only arrives sooner, and on a young domain arriving sooner is the risk you are trying to avoid.

Why today's number can be lower than your target. WarmySender works out every ceiling that applies, sends the lowest, and tells you which one bound:

How a mailbox earns its full target: at least 14 days of warmup, at least 7 days of actual sending, under 2% of warmup mail landing in spam, under 1% bouncing, and maintenance mode. All five together lift the ceiling to your configured target, up to an absolute maximum of 120 a day.

Why volume goes down: placement slipped, the mode changed, you lowered the target, or more mailboxes joined the same domain and are now sharing its volume. Reaching your target, a quiet day and a weekend do not lower it — warmup runs every day.

Why emails trickle out through the day: a day's allowance sent in one burst looks like automation; spread out it looks like a person. The count is low in the morning and reaches the daily figure late on. Compare full days, not part-days — checking at 9am is the most common false alarm.

Does pausing reset progress? No. Progress is counted in sending days, not calendar days, so a mailbox that completed 12 sending days and paused for a fortnight resumes on day 12. After a long gap, volume steps back up over about a week rather than resuming at the old number.

Warmup and cold campaign emails share one per-mailbox daily budget, so a mailbox running 40 warmup emails has 40 fewer available for campaigns that day.

Full tables and every reason explained: /documentation/how-your-warmup-daily-volume-is-decided

AI Agents

Connect WarmySender to ChatGPT and Codex

On ChatGPT, adding your own connector lives behind developer mode, and the write actions a campaign needs — creating, launching, pausing — are a ChatGPT Business, Enterprise or Edu capability. A personal Pro account can connect a custom server for reading only. So if you are one person on ChatGPT Plus, Codex is the path that actually works, and Codex is already included with your paid ChatGPT plan.

Codex setup, in two lines. First create a key in WarmySender under Settings > API Keys (it starts with ws_). Then in your terminal, export that key as a variable and run: codex mcp add warmysender --url https://warmysender.com/mcp --bearer-token-env-var WARMYSENDER_API_KEY. Add the export line to your shell profile so it survives a restart. Prefer not to handle a key at all? Add the server without the key flag and run codex mcp login warmysender to sign in with your normal WarmySender account. In the Codex IDE extension, add the same server under its MCP servers setting and restart the extension.

In a ChatGPT Business, Enterprise or Edu workspace, an owner or admin turns on developer mode, adds a custom connector pointing at https://warmysender.com/mcp, and — on Enterprise and Edu — chooses who may use it. Each member then switches it on in their own settings. Write actions ask you to confirm before they run. The ChatGPT desktop app also has its own MCP servers screen in Settings: add a server, choose the streamable HTTP type, paste the address, save and restart.

API key or sign-in? Sign-in suits one person on their own machine and leaves no key to look after. A key suits terminals, servers and shared setups, and it is the only route that lets you pick exactly which permissions the agent gets, including read-only. Both reach the same workspace, both stay inside the same safe sending limits, and either can be revoked in Settings > API Keys.

No tools showing up? Three causes cover almost every case: your ChatGPT plan does not allow write-capable custom connectors (use Codex); in a workspace, the connector has to be added by an owner and then switched on by you individually; or the key you used carries read-only permissions. Restart the app or start a fresh chat after any change.

Whichever route you take, your agent never sends a message itself and can never raise a limit. It writes the campaign and hands it to WarmySender's scheduler, which paces every send inside safe daily caps and the gradual ramp. Connecting and disconnecting accounts always stays in the app.

Full guide: /documentation/connect-warmysender-to-chatgpt-and-codex

Connect WarmySender to Muse Code

Muse Code connects to WarmySender with a workspace key, not a sign-in screen. Create a key in WarmySender under Settings > API Keys (it starts with ws_), add one block to Muse Code's settings file, start Muse Code again, and you can build, launch and manage your cold email, LinkedIn, Instagram and WhatsApp campaigns by describing what you want.

The file is ~/.config/muse/settings.json — create the folder and the file if they are not there yet. Put this in it, replacing the placeholder with your own key:

{
"schema_version": 1,
"mcp_servers": {
"warmysender": {
"transport": "streamable_http",
"url": "https://warmysender.com/mcp",
"headers": {
"Authorization": "Bearer ws_YOUR_API_KEY_HERE"
}
}
}
}

Save this as ~/.config/muse/settings.json (create the folder if it is not there yet) and start Muse Code again. Keep the schema_version line — Muse Code rejects the file without it. If you already have a settings file, add only the warmysender block inside your existing mcp_servers.

Why the first line matters: Muse Code will not read a settings file that does not declare which format it is written in. The schema_version line has to be there and it has to say 1 — leave it out or change the number and Muse Code refuses the entire file, including anything else you had configured. The other common mistake is leaving a command line inside the WarmySender entry: WarmySender is reached over the network, so the entry carries an address and headers and must not carry a command.

Why a key and not a sign-in? Several agents let you connect by signing in to WarmySender in your browser. Muse Code does not offer that for MCP servers today, so a key is the route we publish for it. Nothing is lost: a key reaches the same workspace, stays inside the same safe sending limits, and can be revoked at any moment in Settings > API Keys. It is also the better fit for a terminal agent, where there is no browser window waiting for you to click approve. If your agent does offer a sign-in screen, see /documentation/connecting-an-ai-agent-that-asks-you-to-sign-in.

No tools showing up? Check the settings file first (a missing or wrong schema version line means nothing loads at all), then the key (mistyped or deleted keys are turned down at startup), then your plan (connecting an agent needs an active paid plan and is included at no extra charge), then the key's permissions (a read-only key shows reading and hides the rest). Restart Muse Code after any change.

Whichever agent you use, it never sends a message, DM or invite itself and can never raise a limit. It writes the campaign and hands it to WarmySender's scheduler, which paces every email and every LinkedIn, Instagram and WhatsApp action inside safe daily caps and the gradual ramp. Connecting and disconnecting accounts always stays in the app.

Full guide: /documentation/connect-warmysender-to-muse-code

Run Cold Email Outreach With Meta Muse Code

Once Muse Code is connected to WarmySender, you run outreach by describing it in a sentence. Build the campaign, add the people, verify the addresses, start it, and ask how it did — all from the terminal, in plain English. What you never do is ask it to send: your agent writes the campaign and hands it to WarmySender's scheduler, which paces every message inside your safe daily caps and the gradual ramp.

Two things to know before you start. WarmySender is not a built-in Muse connector — Meta does not run a catalogue you can install us from, so the connection is one block you add to your own settings file on your own machine. And Muse Code connects with a workspace key rather than a sign-in screen, because it has no browser sign-in step for MCP servers. Setup is at /documentation/connect-warmysender-to-muse-code. One more thing we would rather say than imply: we tested the connection itself and Muse Code really does reach the WarmySender server on startup, but we have not run a WarmySender tool call from inside Muse Code ourselves — the prompts below are the plain-language shape of tools the server exposes to every agent, not a transcript we recorded.

Cold email, start to finish, is four sentences typed one after another. "Check my verification allowance, then verify this list of 800 addresses and tell me how many came back safe to send." "Make a prospect list out of the ones that came back clean." "Build a campaign called 'Agency founders Q4' for that list — a short intro email, then a one-line nudge three days later if they haven't replied, weekdays only, from my two warmed mailboxes." "Start it, and tomorrow tell me what went out and who replied." Step four is the one people expect to be refused and it is not, precisely because starting a campaign does not send anything: it hands the campaign to the scheduler, which spreads sends across your window, respects each mailbox's daily limit, keeps the domain under its ceiling and skips anyone suppressed.

Other channels work the same way. "Create a LinkedIn campaign on my main account: connect first, then message three days after they accept." "Build an Instagram DM campaign for this list and start it." "Launch a WhatsApp campaign on my connected number for these 40 people." Or all at once, in one multichannel campaign. Worth being blunt about: running four channels does not let you send more. Each channel keeps its own budget and none of them pool. Multichannel buys relevance and timing, not volume. Each channel also needs its account connected in the app first.

Do not skip warmup, because it decides whether any of the above lands. "Turn warmup on for my two new mailboxes and set a sensible target volume." "How is reputation building on the mailbox I added last week?" Your agent can set warmup up and read how it is going; it cannot shorten the ramp.

Your agent never sends a message, DM or invite itself and can never raise a limit. Creating or launching only writes the campaign and hands it to WarmySender's scheduler, which paces every email and every LinkedIn, Instagram and WhatsApp action inside safe daily caps and the gradual ramp — the same protections the app uses, whether a human or an agent pressed go. Email verification shares the same allowance and pacing. Connecting and disconnecting accounts stays in the app. For a cautious first week, create a read-only key in Settings > API Keys.

Full guide: /documentation/run-cold-email-outreach-with-meta-muse-code

Can Meta Muse Run My Outreach?

Not through any supported integration, and WarmySender is not a built-in Muse connector. Meta has not documented a connector platform, a plugin store, a developer directory or MCP support for Muse, so there is no route for a company like us to register our tools with it and nothing for you to install. If you want an agent driving your outreach today, the working path is a different Meta product — Muse Code, the terminal agent — or any of the other agents that already connect.

What Muse is: Meta's personal AI agent, announced in September 2026, described by Meta as an agent that does not just answer questions but actually does the work. Meta says it is rolling out in the US on iOS, Android and muse.ai, with AI glasses coming later, that it runs on a dedicated secure computer with its own browser, and that it can open a browser, fill out forms and negotiate on your behalf. People choose which apps Muse connects to and how much access each one gets. So Muse genuinely acts — it just acts through a browser and a short list of integrations Meta chose, rather than an open catalogue other companies can join.

One thing is easy to misread. Meta does publish something MCP-shaped: Meta Ads AI Connectors include an Ads MCP server that, in Meta's words, exposes Meta business surfaces to third-party AI clients and works with any MCP-compatible agent. That is Meta running a server you add into your own agent — the opposite of Meta hosting other companies' tools inside Muse. Seeing Meta and MCP in the same sentence does not mean Muse can reach WarmySender.

There is one unsupported path worth describing honestly. Press coverage of the Muse launch — reporting, not Meta documentation — describes Muse working with a service that has no built-in connector by using a public API with credentials the person supplies. WarmySender does have a public API with keys you create in Settings > API Keys. We have not tested that, we make no claim it works, and we cannot support it. If you experiment at all, create a read-only key and delete it afterwards.

Muse and Muse Code are different products that share a name. Muse is the consumer agent above. Muse Code is Meta's terminal coding agent, installed on your own machine, which reads the servers it can reach from a settings file you control — which is exactly why it can reach WarmySender without anybody's catalogue being involved. We tested that connection: with the WarmySender block in its settings file, Muse Code really does reach our server on startup. To be straight about the limits of the test, we confirmed the connection and not a completed job — we had no key and did not create one, so we have never run a WarmySender tool from inside Muse Code and do not claim to have. Setup: /documentation/connect-warmysender-to-muse-code. Workflow: /documentation/run-cold-email-outreach-with-meta-muse-code.

Whichever agent you use, the limits are ours rather than the agent's. No agent sends a message, DM or invite itself and none can raise a limit. Launching a campaign hands it to WarmySender's scheduler, which paces every email and every LinkedIn, Instagram and WhatsApp action inside safe daily caps and the gradual ramp. Connecting and disconnecting accounts stays in the app. The guardrails are not a setting inside the agent that a clever prompt could talk round; they are enforced by the thing that actually does the sending.

Full guide: /documentation/can-meta-muse-run-my-outreach

What Your AI Agent Can and Cannot Do With Cold Email

Your AI agent can build, launch, pause, resume and report on your cold email campaigns, create and enroll prospects, work from your saved templates, verify email addresses and configure warmup — all in plain language. It can never send a single message itself, never raise a limit, never connect or disconnect an account, and never outrun the ramp. Those four are not settings left switched on; there is simply nothing an agent can call that does them.

What it can do, area by area:

Why it cannot send: starting a campaign only writes it down and hands it to WarmySender's scheduler, which then spreads sends across your sending window, respects each mailbox's daily limit, keeps the whole domain under its ceiling and skips anyone on your suppression list. If your agent misunderstands you and enrolls five thousand people, the result is a queue that drains at your normal safe pace, not five thousand emails.

Why it cannot raise a limit: nothing an agent can call moves a daily cap, a warmup stage or a domain ceiling. It can set a campaign's daily limit, but the number that actually applies is still the lowest of your per-mailbox limit, your mailbox's combined warmup-and-cold budget, your domain's ceiling and your plan's allowance.

Why connecting stays in the app: connecting a mailbox or a social account means handling a credential, and no credential should pass through an agent or a chat log.

If your agent gets something wrong, nothing goes out in a burst, pausing is one sentence and is never blocked, and everything it built is a normal campaign you can open, edit or delete. For a cautious start, create a read-only key in Settings > API Keys.

Full matrix: /documentation/what-your-ai-agent-can-and-cannot-do-with-cold-email

Verify Emails With an AI Agent

Connect WarmySender to Claude, ChatGPT, Cursor, Codex, OpenClaw or Hermes Agent — or any agent that speaks MCP — and ask it in plain language to check a single address or a whole list. It reads the results back, turns the confirmed addresses into a list, and builds the campaign around them, in the same conversation. What it cannot do is send to them: your agent never sends a message itself and can never raise a limit.

What you can ask for:

The verify-then-launch flow, in five sentences: check your allowance, hand over the list, keep the addresses that came back safe to send, build the campaign for that list, then ask how it did. Step four is the one people expect to be blocked and it is not — your agent really can start the campaign, because starting it simply hands it to the scheduler.

How your allowance is spent: your agent shares the same monthly allowance and credits you use in the app, and it cannot verify any faster. You are only charged for answers — one credit per confirmed result, nothing for an address that cannot be confirmed either way. Credits never expire and top up your plan's monthly allowance.

Leads from the built-in business database are a starting point, not a promise about a mailbox today. Save them, then verify them, then build the campaign from what came back clean.

What an agent cannot do here: send anything, raise any limit, connect or disconnect an account, or find an address you do not have. Verification confirms addresses you already have; it does not discover new ones. To get addresses, use the built-in business database or import a list that already contains them.

Full guide: /documentation/verify-emails-with-an-ai-agent

Run LinkedIn Outreach With an AI Agent

Claude, ChatGPT, Cursor, Codex, OpenClaw and Hermes Agent — or any agent that speaks MCP — can build, launch, pause, resume and report on your LinkedIn campaigns in plain language, publish posts, and run recruiter jobs. None of them can send an invite or a message, and none of them can raise a limit. Your agent writes the campaign; WarmySender's scheduler decides what actually goes out, spacing every invite and message inside your account's daily and hourly limits and its gradual ramp.

What an agent can do: create a campaign and choose the account and steps, launch, pause and resume it, enroll prospects, draft and publish posts (and delete them, and read their engagement), create, publish and close recruiter job postings and read the applicants with a Recruiter seat, and report on campaign stats, account health and why an account is quiet today.

What it cannot do: send any invite or message itself, raise a daily or hourly limit, shorten the ramp, skip a cooldown, or connect and disconnect a LinkedIn account — that always stays with you in the app, and a LinkedIn seat is required.

How limits behave with an agent driving: exactly as they do otherwise. A new account starts slow on purpose and speeds up as it earns it. Pauses are normal and usually temporary, and your agent can tell you when one lifts. Stopping is never blocked. And run only one automation tool per account — running two doubles the footprint LinkedIn sees, and careful pacing on our side does not compensate.

Why some people get skipped: usually a missing or unusable profile link. Lists exported from a Sales Navigator search often carry an internal reference to that saved list rather than a real profile address, and WarmySender skips those rather than guessing who is meant — guessing is exactly what gets accounts restricted. Ask your agent which people were skipped and why, then re-import those contacts with their normal profile links and enroll them again.

Things worth saying: "Create a LinkedIn campaign called 'Founders Q4' on my main account, connect first and message three days after they accept, enroll these 60 profiles, and start it." "Pause every LinkedIn campaign on that account until Monday." "Why is that account quiet today, and when does it pick up again?" "Publish a post about our new release, then show me the engagement in two days."

Full guide: /documentation/run-linkedin-outreach-with-an-ai-agent

Run Multichannel Outreach With an AI Agent

Describe the campaign in plain language — who you are reaching, which channels, what each step says, how long to wait — and your agent builds it across cold email, LinkedIn, Instagram and WhatsApp, then hands it to WarmySender's scheduler. Each channel then paces itself inside its own limits. That last clause is the important one: running four channels does not let you send more. It lets you reach the same person in more than one place.

What your agent can set up per channel: cold email (create, launch, pause, resume, enroll, plus the sending window and daily limits — needs a connected mailbox); LinkedIn (the same, plus posts and recruiter jobs — needs a LinkedIn seat and a connected account); Instagram (create, launch, pause, resume, enroll — needs an Instagram seat and a connected account); WhatsApp (the same — needs a connected number). On every channel it can report on what happened and explain why a channel was quiet today. On no channel can it connect or disconnect the account.

Which limit applies where: cold email is held by your per-mailbox daily limit, the mailbox's combined warmup-and-cold budget, your domain's ceiling and your plan's allowance, lowest wins. LinkedIn is held by the account's daily and hourly ceilings plus the gradual ramp on newer accounts. Instagram draws follows, profile views, likes, comments and DMs from one shared action budget rather than giving each type its own. WhatsApp keeps its own daily pace and ramp. None of these budgets pool: adding LinkedIn does not give your mailbox more room, and adding Instagram does not lift LinkedIn's ceiling.

What multichannel genuinely buys you is relevance and timing — a connection request that follows an unanswered email reads differently from a fourth email. That is a real gain. It is just not extra volume.

A prompt that works names four things: who, which channels, what each step says, and the timing between them. For example: "Build a campaign called 'Agency founders' for this list of 120 people. Step one: a short email introducing us. Step two, three days later if they haven't replied: a LinkedIn connection request from my main account. Step three, four days after they accept: a LinkedIn message referring to the email. Weekdays only, send from my two warmed mailboxes, then start it."

You can also ask why nothing sent today, and get a plain answer: the sending window had not opened, the daily limit was already used, a channel is resting and when it resumes, people were skipped because they are on your suppression list, or a profile link was missing.

Full guide: /documentation/run-multichannel-outreach-with-an-ai-agent

Use the Lead Database With an AI Agent

Ask Claude, ChatGPT, Cursor, Codex, OpenClaw or Hermes Agent — or any agent that speaks MCP — to search WarmySender's built-in database of 200M+ USA and Canadian business records, save what it finds as a list, and build the campaign around it. Searching and browsing are free and never spend anything; a credit is spent only when a new lead is actually saved or exported. Your agent never sends a message and can never raise a limit.

What it can search by: role or job title, company, industry, company size, and location — country, city, postcode, and street-level detail for the US and Canada. Narrowing a search half a dozen times costs nothing.

What costs what: searching, filtering and paging are free. Saving costs one credit per new lead, and so does exporting; re-saving a lead you already own is free, and a record without an email address is not charged at all. Every record stays masked until it is saved, which is exactly why browsing is free — the meter starts when you say "save these". Ask for the count first: "How many people match that before we commit any credits?"

Why your monthly allowance is spread across the month: on purpose. Your plan's monthly leads are released evenly — roughly the monthly total divided across the month — so a single afternoon cannot consume everything and leave you with nothing for three weeks. That pacing applies whether you or an agent is saving. Lead credits are the deliberate way around it: they never expire and are not held to the daily pace.

Treat every saved lead as unverified until you have checked it. A record tells you about a person and a company; it does not tell you whether that mailbox will accept mail today. The habit is one sentence: "Save these, verify them, and build the campaign from the ones that came back safe to send."

What an agent cannot do here: spend faster than the daily pace, buy credits (anything touching billing stays with you in the app), send to anyone, raise any limit, or promise that an address is good — only verification tells you that.

The lead database is available on Pro plans and up.

Full guide: /documentation/use-the-lead-database-with-an-ai-agent

Which AI Agents Can Run Outreach?

Any agent that speaks MCP can connect to WarmySender — Claude, ChatGPT, Cursor, Codex, OpenClaw, and Hermes Agent among them — but what each app is allowed to do differs by app and by plan, and that is where most setups stall. We also publish one-paste setup for Claude Desktop, Claude Code, Grok Bot, Windsurf and Zed.

MCP — the Model Context Protocol — is an open standard for connecting an AI app to outside tools through one common interface. WarmySender publishes an MCP server, so any app that speaks the protocol can drive it with no special integration built first. An agent released next month works on day one.

How each app connects (checked against each vendor's own documentation on 6 September 2026):

These are other companies' products and they change quickly. If your screen does not match what you read here, trust your screen.

Sign-in or key? Sign-in suits your own laptop and one person, with no key to look after. A key suits terminals, servers and shared setups, and it is the only route that lets you choose exactly which permissions the agent gets, including read-only. Both reach the same workspace, both stay inside the same safe sending limits, and either can be revoked in Settings > API Keys.

MCP or the API? MCP when a person is in the loop and talking to an agent; the API when software is in the loop — your own product, a nightly script, a workflow tool. Same capabilities, same safety limits.

Whatever you connect, the safety line is identical: the agent never sends a message itself, can never raise a limit, and cannot connect or disconnect an account.

Full table with sources: /documentation/which-ai-agents-can-run-outreach

Build Your Own AI SDR With an AI Agent

Connect WarmySender to Claude, ChatGPT, Cursor, Codex, OpenClaw or Hermes Agent — or any agent that speaks MCP — and you can assemble a working AI SDR. In plain language it finds leads in the built-in business database, verifies them, builds a multi-step campaign, launches it, and reports back. What it never does is send a single message itself or lift a limit: WarmySender's scheduler paces every send, and the deliverability ceiling every provider enforces — a spam-complaint rate that must stay under 0.3% — is what really governs how fast an SDR can grow.

The honest split: your agent runs the pipeline, WarmySender runs the sending. The pipeline has five stages and your agent can do all five from one conversation.
• Find leads — search the built-in database by role, company, industry, size and location, save what it finds, export it. Searching and filtering are free; a credit is spent only when a new lead is saved.
• Verify — check one address or a whole list, read results back, cancel a running batch, check the remaining allowance first, and turn the confirmed addresses into a clean list.
• Build the campaign — create a multi-step sequence, work from your saved templates, set the sending window, choose which mailboxes send, enroll people one at a time or in bulk, and configure warmup on those mailboxes first.
• Launch — start, pause and resume it. Enrolling a large list is safe, because starting only hands the campaign to the scheduler, which drains it at your normal daily pace, not in a burst.
• Report and adjust — how it did, who replied, which mailboxes look weak, and why something sent nothing yesterday.

What it cannot do: send any message, raise any limit (daily caps, warmup stages and domain ceilings cannot be moved by anything an agent can call), connect or disconnect a mailbox (credentials never pass through an agent), buy credits (billing stays with you), or read and reply to responses (that stays in the app). The real ceiling on growth is your spam-complaint rate — keep it under 0.3%, and stay under 0.1% if you can — which is exactly why verification and warmup are the non-negotiable middle of the pipeline, not optional extras.

Start read-only if you like: when you create a key in Settings > API Keys you pick exactly which permissions it carries, so your SDR can research and report for a week before you let it change anything.

Full guide: /documentation/build-your-own-ai-sdr-with-an-ai-agent

Set Up and Monitor Email Warmup With an AI Agent

Connect WarmySender to Claude, ChatGPT, Cursor, Codex, OpenClaw or Hermes Agent — or any agent that speaks MCP — and it can turn warmup on for a mailbox, choose its strategy (new domain, new mailbox, steady maintenance or recovery), set the target volume it grows toward, apply the same settings across a whole set of mailboxes at once, and read back how each one's reputation is building. What it cannot do is send the warmup mail itself, shorten the ramp, or lift a limit — warmup rises gradually on its own schedule, and nothing an agent can call moves it.

Warmup is the cleanest example of the agentic design: everything an agent touches here is configuration and reporting. The warmup mail itself — the small, growing stream of messages that real inboxes open and reply to — is produced and paced by WarmySender, on a ramp an agent has no access to. So 'warm all twelve of my new mailboxes' does not release twelve mailboxes at volume; it starts twelve gentle ramps, each beginning at a single email a day.

What it can do: enable warmup on a mailbox you have already connected; set the strategy and the target (most mailboxes grow toward 40 warmup emails a day by default; the strategy sets the ceiling); apply settings across many mailboxes in one instruction; and monitor — today's warmup volume and the reason for it, whether warmup mail is actually arriving on the incoming side, and how reputation is building over time. A weekly 'check every mailbox's warmup and flag the weak ones' is one sentence.

What it cannot do: send the warmup mail; make warmup finish faster (the ramp advances on sending days, not calendar days — a mailbox disconnected for a while is simply a few sending days behind); turn warmup on for a disconnected mailbox; connect a mailbox or see a password; or remove the small reference tag in the subject that lets you filter warmup mail out of your own inbox.

If warmup slows or pauses it is usually a safeguard working: if around 5% of a mailbox's warmup mail starts landing in spam, WarmySender automatically eases that one mailbox back — judged per mailbox, never punishing the others — and your agent can surface which mailbox and watch it recover. Neither you nor an agent can lift that slowdown, because the slowdown is the fix. Leave warmup running permanently once mailboxes are warmed; your agent can move a whole set onto steady maintenance in one instruction.

For the day-by-day curve and everything that shapes it, see /documentation/how-your-warmup-daily-volume-is-decided.

Full guide: /documentation/set-up-and-monitor-email-warmup-with-an-ai-agent

Run Instagram DM Outreach With an AI Agent

Connect WarmySender to Claude, ChatGPT, Cursor, Codex, OpenClaw or Hermes Agent — or any agent that speaks MCP — and it can build, launch, pause, resume and report on your Instagram DM campaigns in plain language, and enroll the people you choose. None of them can send a DM itself, and none can raise a limit. WarmySender's scheduler paces every follow, like, comment and DM inside each account's strict caps — a combined 100 actions a day and 10 an hour — on a schedule an agent cannot reach.

Instagram is the channel where that separation matters most, because a restricted account is hard to recover and a banned one is not recoverable at all, and the platform watches new accounts closely.

What an agent can do: create a campaign and choose the account and steps, launch, pause and resume it, and enroll people from your prospects, your lists, or by @handle or profile link. It can build a sequence that follows, views a profile, likes and comments on a post, then sends a DM, with waits in between and a 'stop if they reply' step. And it can report on how a campaign is doing and why an account is quiet today.

What it cannot do: send any action itself; write a DM over 1,000 characters or a comment over 1,250 (Instagram itself cuts anything longer, so those are hard caps); raise the 100-a-day or 10-an-hour ceiling; shorten a new account's ramp; fire actions in a burst; connect or disconnect an account (that stays in the app and needs an Instagram seat); or read and reply to DMs (that happens in WarmySender's inbox, with you — replies you send there are uncapped).

How the limits behave with an agent driving: exactly as otherwise. The 100/day and 10/hour are one COMBINED budget across all action types — a follow, a view, a like, a comment and a DM each count as one — so a heavier sequence uses more of the day's budget per prospect and reaches fewer people in a day. New accounts start well below the ceiling and climb over their first weeks; actions are spaced with natural randomness, never bursted; inbound replies are free; and stopping is never blocked. These are ceilings, not settings — for more reach, connect another account, each with its own independent budget.

Full guide: /documentation/run-instagram-dm-outreach-with-an-ai-agent

Connect Your AI Agent and Run Outreach in Plain Language

Connect Claude, ChatGPT, Cursor, Codex, OpenClaw or Hermes Agent — or any agent that speaks MCP — to WarmySender by pointing it at https://warmysender.com/mcp and signing in with your WarmySender account. There is no API key to copy: your agent opens a WarmySender sign-in screen, you approve, and you are connected. Connecting an agent needs an active paid plan.

Four ways to connect, pick the one that fits. (1) Sign in — the default. Claude: In Claude open Customize → Connectors, choose + then Add custom connector, paste this address and click Add. Claude then opens a WarmySender sign-in — approve it and you are connected. Claude Code: one terminal command (claude mcp add --transport http warmysender https://warmysender.com/mcp). ChatGPT and Codex: codex mcp add warmysender --url https://warmysender.com/mcp, then codex mcp login warmysender (Codex is included with ChatGPT Plus and up). Cursor: add the address under mcpServers in .cursor/mcp.json and sign in when asked. Hermes Agent: add it to ~/.hermes/config.yaml with auth: oauth and run /reload-mcp. OpenClaw: openclaw mcp add warmysender --url https://warmysender.com/mcp --transport streamable-http --auth oauth, then openclaw mcp login warmysender. The few agents without a sign-in screen yet (Grok, for example) get the API-key snippet instead — the page shows the exact steps for each. (2) One click — the Add to Cursor button opens Cursor with WarmySender filled in; the Add to Claude link opens Claude's connector settings. Neither carries a key. (3) Install the WarmySender skill — npx skills add fortuneflick/warmysender-claude-plugin, or in Claude Code /plugin marketplace add fortuneflick/warmysender-claude-plugin then /plugin install warmysender@warmysender. In Cursor and Grok install it from the repo today with the same npx command; their marketplace listings are submitted and will appear once approved. The skill is a short public playbook that makes your agent ask fewer questions and get the first campaign right. (4) Paste one paragraph — for agents with no settings screen, paste the connection paragraph from the page into the chat and the agent connects itself and opens the sign-in link.

Prefer a key, or running an agent on a server where nobody can click a sign-in screen? Create a key in Settings, API Keys (it starts with ws_), add WarmySender to your agent with the same address and that key, and ask in plain English. Settings, MCP shows the same setup for every agent — choose Use an API key there and paste your key where the placeholder sits.

What your agent can then do: build, launch, pause, resume and report on cold email, LinkedIn, Instagram and WhatsApp campaigns; enroll prospects; publish LinkedIn posts and run recruiter jobs; search the built-in leads database and save what it finds; verify email addresses; tune warmup; and check inbox health, stats and why a campaign sent nothing today. Your agent never sends a message itself and can never raise a limit — creating or launching a campaign only hands it to WarmySender's scheduler, which paces every email, LinkedIn, Instagram and WhatsApp action inside safe limits, and email verification shares the same allowance and pacing. Connecting and disconnecting your accounts stays in the app. Included with every active paid plan; revoke access any time in Settings, API Keys.

Connect WarmySender to Claude

Connect WarmySender to Claude on the web or in the desktop app in about a minute, with no API key. First sign in to warmysender.com in the same browser, so the approval finishes in a couple of clicks. The address to paste is https://warmysender.com/mcp. In Claude open Customize → Connectors, choose + then Add custom connector, paste this address and click Add. Claude then opens a WarmySender sign-in — approve it and you are connected. WarmySender then appears in Claude's tool list. The desktop app uses the same Connectors screen. Connecting an agent needs an active paid WarmySender plan.

Two ways to sign in on the approval screen: with the Google or Apple account you use for WarmySender, or with your email and password. If the connector shows greyed out after adding it, you have not finished the approval yet: open it, choose Connect, and complete the sign-in. If the approval screen never appears, sign in to warmysender.com first and try again — the approval window is about 30 minutes.

Once connected, ask Claude in plain English: "Which of my mailboxes have low inbox placement this week?", "Create a 3-step cold email campaign called Q3 SaaS founders, enroll these 40 leads and launch it", "Pause the Recruiter Outreach LinkedIn campaign". Claude never sends a message itself and can never raise a limit — creating or launching a campaign only hands it to WarmySender's scheduler, which paces every email, LinkedIn, Instagram and WhatsApp action inside safe limits. Connecting and disconnecting your mailboxes and social accounts stays in the app. You can remove Claude's access any time in Settings, API Keys, or from Claude's Connectors screen. Prefer a key, or want the same steps for another agent? See Connect your AI agent.

Troubleshooting

Connecting an AI agent that asks you to sign in

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 — it was 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

"534-5.7.14 Invalid login" error

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.

"Connection refused" error

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.

"Mailbox full" — my mailbox ran out of space and warmup stopped

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

"SMTP authentication disabled" or error 5.7.139

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:

How to fix (requires your IT admin):

For Microsoft 365:

  1. Your admin must go to Microsoft 365 Admin Center (admin.microsoft.com).
  2. Navigate to Users → Active Users → Select your account.
  3. Click the Mail tab → Manage email apps.
  4. Check the box for 'Authenticated SMTP' and save.
  5. Wait 15-30 minutes for the change to propagate.

If your organization has Security Defaults enabled (common for new M365 tenants):

  1. Your admin must go to Azure Portal (portal.azure.com) → Microsoft Entra ID → Properties.
  2. Click 'Manage Security Defaults' at the bottom.
  3. Set 'Security defaults' to Disabled (note: this reduces security for the entire org — discuss with your IT team).
  4. 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.

"Server not found" or DNS resolution error

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:

  1. Typo in the hostname — Double-check for misspellings (e.g., 'smpt.gmail.com' instead of 'smtp.gmail.com').
  2. 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).
  3. Domain expired or DNS not configured — If using a custom domain, verify it has not expired and has valid MX records.
  4. Temporary DNS issue — Try again in a few minutes. If persistent, try using a different network or contact your internet provider.

Correct hostnames for common providers:

Debugging: Copy-paste the hostname from the Provider Setup Guides above to avoid typos.

Warmup Bounce Classification — how WarmySender protects mailboxes from cascade-pauses

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

Companion docs

Connect HubSpot to WarmySender

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:

Why teams run HubSpot outreach through WarmySender:

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:

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:

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.

Related guides: warmysender.com/docs/integrations (API & webhooks reference), warmysender.com/blog/integrations/hubspot-integration (step-by-step walkthrough), /documentation#integration-webhooks (webhooks getting started), /documentation#integration-zapier (Zapier), /documentation#integration-n8n (n8n).

Connect a Microsoft 365 Mailbox to WarmySender

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:

  1. Open Mailboxes → click Add Mailbox.
  2. Pick Sign in with Microsoft.
  3. 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.
  4. Click Continue with Microsoft. Microsoft will always show you the account picker, even if you're already signed in.
  5. Pick the account, allow the permissions.
  6. 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:

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:

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:

  1. 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.
  1. 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.
  1. 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

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

Mailbox Reconnection — when and how to reconnect

When you see a Reconnect Required badge on a mailbox — or the Reconnect Required banner on the dashboard — something on that mailbox needs your attention. Before anything else, check WHICH of two very different problems it is, because they call for opposite reactions and only one of them stops your mail.

Two different problems, one badge

How to tell them apart in one glance: read the mailbox row on the Mailboxes page. If the Sending column still says Active, your sending is genuinely fine and you are looking at the reading case. The note on the mailbox says which of the two it is in plain words.

This page explains exactly when WarmySender flags a mailbox because it cannot SEND, 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:

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:

Why an app password can stop working after it worked fine for months

If a mailbox you connected with an App Password suddenly needs reconnecting after weeks or months of working perfectly, you almost certainly did nothing wrong. Email providers — Google especially — retire an App Password on their own from time to time, and when they do, the saved one simply stops being accepted. The usual triggers are all normal account housekeeping: the account's main password was changed, two-step verification was switched off and on again, or an administrator tightened the account's security settings. Any of these can quietly cancel an App Password that was working a moment ago, even though nothing about WarmySender or your mailbox changed. This has become more common lately as providers harden their security, so if you are seeing it on a Google mailbox in particular, it is an industry-wide trend and not a fault on your side.

The fix takes a minute — generate a fresh App Password and paste it in:

You will see these mailboxes flagged inside the app — on the mailbox row and in the dashboard's reconnect notice, which shows how many mailboxes need reconnecting — so they are easy to spot at a glance. Once the new password is saved, sending resumes and warmup picks back up on its own, and no warmup history is lost. WarmySender never emails you to do this, so treat any email that asks you to reconnect as phishing and act only from warmysender.com.

One note that is NOT this: if your mailbox instead says we cannot READ the inbox, nothing is wrong with your sign-in and your sending is completely unaffected — see the two-problems section at the top of this page, and /documentation/why-we-cannot-read-your-inbox for the full explanation. The usual cause there is a reading permission your administrator has left switched off, but that is not the only possibility, so if you check and find the permission already on, stop there and tell us rather than changing anything else.

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.

What happens in the meantime?

Everything in this section describes the "we can't send" case. If your mailbox is in the reading case instead, none of it applies except the last point: campaigns and warmup carry on sending exactly as normal, and only the reading of the inbox is paused.

How long does reconnection take?

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.

"Authentication failed" error

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:

Provider-Specific Steps:

Gmail:

  1. You must use an App Password, not your regular Google password.
  2. Go to https://myaccount.google.com/apppasswords (2FA must be enabled first).
  3. Generate a new App Password for 'Mail' and paste it into WarmySender.
  4. Your username must be your full Gmail address (e.g., [email protected]).

Outlook / Microsoft 365:

  1. Generate an App Password at https://account.live.com/proofs/AppPassword or via your M365 admin portal.
  2. 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'.
  3. Your username must be your full email address (e.g., [email protected] or [email protected]).
  4. If you see error 534 5.7.14 or 'Please log in via your web browser', sign in to Outlook on the web first and complete any security prompts.

Hostinger:

  1. Use your regular email password (not an App Password).
  2. SMTP host must be smtp.hostinger.com (not mail.yourdomain.com).
  3. Your username is your full email address (e.g., [email protected]).
  4. If you recently changed your password, wait a few minutes for propagation.

Zoho:

  1. If 2FA is enabled, generate an App Password at https://accounts.zoho.com/home#security/security_apppassword.
  2. If 2FA is not enabled, your regular Zoho password should work.
  3. Your username is your full email address.
  4. SMTP host: smtp.zoho.com (or smtp.zoho.eu / smtp.zoho.in depending on your region).

Yahoo:

  1. You must use an App Password. Go to https://login.yahoo.com/account/security and generate one under 'App Passwords'.
  2. Your username is your full Yahoo email address.

Debugging Steps:

  1. Verify your username is your full email address (e.g., [email protected]), not just the part before the @.
  2. Re-generate a fresh App Password and paste it carefully — avoid trailing spaces.
  3. Confirm the SMTP host and port match your provider's requirements (see Provider Setup Guides).
  4. Log in to your email provider's web interface and check for any security alerts or prompts that need to be resolved.
  5. If you recently enabled 2FA, any previously saved passwords are invalidated — generate a new App Password.
  6. 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.

"Self-signed certificate" or SSL/TLS errors

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):

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.

"Mailbox not found" error

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:

  1. 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.
  2. Typo in email address — Double-check for misspellings, extra spaces, or wrong domain (e.g., @gmial.com instead of @gmail.com).
  3. 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.
  4. 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:

Debugging Steps:

  1. Copy-paste your email address to avoid typos.
  2. Log in to your email provider's webmail to confirm the account is active and accessible.
  3. Check with your domain administrator that the mailbox has not been deleted or disabled.
  4. If using a custom domain, verify that MX records are properly configured and pointing to the correct mail server.

Warmup emails going to spam

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.

"Too many requests" or rate limiting

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.

Mailbox disconnected or connection lost

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.

Daily sending limit reached

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.

My LinkedIn account won't connect (a failed connection attempt)

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' — a fully supported method on the same connect screen, not a last resort. It needs nothing copied, so a bad paste cannot defeat it. 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: first sign in to linkedin.com in a normal browser tab 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 check you are connecting the right account, and wait for the short countdown between tries.

If the cookie is refused two or three times, switch to 'Email & Password': stop re-pasting the cookie and use the other method on the connect screen. This is the most useful thing to try, and it is where people who stay stuck for days usually go wrong — they keep repeating the cookie method because it is the recommended one. A cookie can keep being refused for reasons a fresh copy will never fix: it was copied from a different LinkedIn account than the one you mean to connect, LinkedIn has already ended the session behind it, or something in the browser alters the value as you copy it. 'Email & Password' does not depend on copying anything, so it sidesteps all of that. Expect a verification code — enter it promptly, as codes expire quickly, and request a new one if it lapses.

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

LinkedIn account restricted or blocked

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 detects the restriction by itself 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.

LinkedIn invites not being accepted

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.

Campaign in cooldown mode

Campaigns auto-enter cooldown when a safety threshold is exceeded. This protects your sender reputation. The trigger is your bounce rate: once a campaign has enough sends to judge fairly, a bounce rate above 5% (the default threshold) stops it. If you set the optional reply-rate floor on a campaign, a reply rate far below that floor can pause it too.

Cooldown does not lift on its own. The campaign stays paused until you fix the cause and click Resume — and resuming starts a fresh safety baseline, so from then on the campaign is judged on what it sends after you resumed rather than on the bounces that paused it.

To fix: 1) Check your prospect list quality — remove invalid or catch-all email addresses. 2) Run the list through the Email Verifier before you resume; this is the single most effective way to bring a bounce rate down. 3) Verify your DNS records (SPF, DKIM, DMARC) are correct. 4) Lower your daily sending volume. Then open the campaign and click Resume.

Spam complaints are not a trigger. When a recipient reports your email as spam, that report goes to their own mailbox provider — your campaigns send from your own connected mailbox, so it never reaches WarmySender and we cannot count complaints or pause on them. Watch your complaint rate in Google Postmaster Tools (Gmail) or Microsoft SNDS (Outlook).

The campaign status will show 'Cooldown' in orange on your Campaigns page.

Full explainer with the arithmetic worked through, the list-cleaning steps in order, and how to set a stricter limit: warmysender.com/documentation/why-did-my-campaign-pause-for-bounces

CSV import failed or contacts not imported

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.

Tracking domain verification failed

Custom tracking domains require a CNAME DNS record pointing to track.warmysender.com, on a SUBDOMAIN of a domain you own. Common issues: 0) 'A tracking domain must be a subdomain' — you entered your bare domain (acme.com) rather than a subdomain (track.acme.com). Bare domains are refused when you add them, because pointing your bare domain at us would take your own website and email routing offline; accept the suggested track. version, or type your own subdomain. 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.

Emails landing in Promotions or spam folder

First, a limit worth knowing about: WarmySender cannot tell you where your campaign emails landed. We have no view inside your recipients' mailboxes, so nothing in the app reports a Promotions-tab or spam-folder placement for a campaign — you will normally find out from a reply, or by sending yourself a test. (The inbox and spam rates on your Warmup pages are a different thing: they come from warmup mail sent to our own peer network, which is the only mail we can follow all the way in. Even there we only tell inbox from spam, never which Gmail tab.)

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. The hint under the email editor tells you which side you are on: 'Plain look' or 'Styled'. If it says Styled on a first cold email, select all and click Clear formatting. See /documentation/format-your-emails. 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) Verify your list with the Email Verifier before sending — invalid addresses drive bounces, and a high bounce rate is itself a signal that pushes you toward the spam folder.

How unsubscribe links work

Every campaign email gives the recipient a way to opt out, automatically — you never have to add anything by hand in the campaign editor. What you DO control is the style and the wording, both in Settings > Account. Full explainer: /documentation/unsubscribe-link-in-campaign-emails

What happens automatically:

When a prospect clicks unsubscribe:

Viewing unsubscribed contacts:

Compliance:

Outlook OAuth token expired, or Gmail App Password stopped working

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.

LinkedIn analytics showing fewer connections than expected

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:

  1. 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.
  1. Manual acceptances — If you sent connection requests outside of WarmySender (directly on LinkedIn), those are not tracked in campaign analytics.
  1. 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.
  1. 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.
  1. 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.

To get the most accurate picture:

Excel (.xlsx) file import not working

WarmySender only supports CSV (Comma-Separated Values) file format for prospect imports. Excel files (.xlsx,.xls) are not directly supported.

How to Convert Your File:

From Microsoft Excel:

  1. Open your Excel file.
  2. Click File > Save As (or Export).
  3. In the 'Save as type' dropdown, select 'CSV (Comma delimited) (*.csv)' or 'CSV UTF-8 (Comma delimited) (*.csv)'.
  4. Click Save. If prompted about losing features, click 'Yes' — CSV only stores data, not formatting.
  5. Upload the resulting.csv file to WarmySender.

From Google Sheets:

  1. Open your spreadsheet in Google Sheets.
  2. Click File > Download > Comma Separated Values (.csv).
  3. The CSV file downloads to your computer.
  4. Upload this.csv file to WarmySender.

From Apple Numbers:

  1. Open your file in Numbers.
  2. Click File > Export To > CSV.
  3. Click Save.
  4. Upload the.csv file to WarmySender.

CSV Requirements:

Common Issues After Conversion:

Tip: After converting, open the CSV in a text editor (Notepad, TextEdit) to verify it looks correct before uploading.

Cannot save LinkedIn connection step with blank message

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:

  1. 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.
  1. 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.
  1. Template selection issue — If you selected a template but then cleared the text, try deselecting the template entirely (set template to 'None') before saving.
  1. Browser cache — Try refreshing the page (Ctrl+F5 / Cmd+Shift+R) and re-entering the step configuration.
  1. 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:

DNS record setup not working (SPF, DKIM, DMARC)

Step-by-step troubleshooting for DNS authentication records:

  1. Propagation delay — DNS changes can take 24-48 hours to take effect globally. If you just added records, wait and re-check.

2) SPF record issues:

3) DKIM record issues:

4) DMARC record issues:

5) Verification in WarmySender:

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.

Handling spam complaints from recipients

If recipients are marking your campaign emails as spam, take immediate action:

  1. 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.
  1. What WarmySender can and cannot see — we cannot see spam complaints on your campaigns, and it is better you know that now than wait for a warning that will never arrive. Your campaigns send from your own connected mailbox, so when someone clicks 'Report spam' the report goes to their mailbox provider and never reaches us. Nothing here counts complaints, and no campaign is paused because of them. Track your complaint rate where it is actually reported — Google Postmaster Tools for Gmail, Microsoft SNDS for Outlook — aiming to stay under 0.1%. WarmySender's automatic protection is bounce-based: a campaign whose bounce rate crosses its threshold is paused for you.

3) Immediate steps:

4) Root causes and fixes:

5) Recovery:

Can't sign in, or your session expired

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
Start with the quick checks:
• Look in your spam or junk folder — it's the most common place codes end up. Marking the message as 'not spam' helps future ones land in your inbox.
• Give it a minute. Codes usually arrive within seconds, but a busy email provider can add a short delay.
• Check the address you entered. If it wasn't the one your account is under, the code went there instead (see 'My account looks empty' below).

If it still hasn't turned up, don't keep requesting new ones — a new code travels exactly the same path as the last one, so it will do the same thing. Sometimes the hold-up is at your end, and sometimes it's at ours. Either way you don't have to sit and wait for it. Any of these will get you in:

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 any address you can send from — and tell us the address your account is under and what you see on screen. We answer within 24 hours on business days.

Webhook events not firing or not received

If your webhook endpoint is not receiving events from WarmySender:

  1. 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:

  1. Test your endpoint — Click 'Test' in webhook settings to send a test event. If the test fails, your endpoint has an issue.
  1. 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:

  1. Retry policy — Failed deliveries are retried up to 10 times with exponential backoff (1min to 72hrs). Events are not lost on first failure.
  1. Signature verification — Verify using the X-Warmy-Signature header with your webhook secret (HMAC-SHA256). Format: t=timestamp,v1=signature.
  1. 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.

LinkedIn Search Errors or Missing Filters

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 taking too long (days or weeks)

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:

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.

LinkedIn enrichment failed or stopped

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) Too Many Errors in One Day:
If enrichment keeps erroring, we stop it for the day to protect your account. This can happen if LinkedIn is temporarily rate-limiting your profile views. Solution: Wait 24 hours, 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:

  1. Reconnect your LinkedIn account if disconnected
  2. Go to LinkedIn > Audiences and select your audience
  3. Click 'Start Enrichment' or 'Retry' to restart the process
  4. Previously enriched profiles are cached — the system picks up where it left off, not from scratch

Why does enrichment use my LinkedIn account?

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:

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.

Can I start a LinkedIn campaign without enrichment?

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:

Recommended Workflow for Large Audiences:

  1. Import your audience (e.g., 1,000 profiles from a Sales Navigator search)
  2. Start enrichment in the background (LinkedIn > Audiences > Start Enrichment)
  3. Create your campaign immediately — do not wait for enrichment
  4. Launch the campaign — it will process prospects using available data
  5. 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.

Dashboard health score dropping but warmup scores are fine

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:

  1. 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.
  1. 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.
  1. 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.
  1. 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:

Analytics page showing no data or not updating

If your Analytics page shows no data or appears empty, check the following:

  1. 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).
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. Browser cache — Try a hard refresh (Ctrl+F5 or Cmd+Shift+R) to force reload the page data.
  1. 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].

Prospects failed with 'stuck in processing loop' error

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:

  1. 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.
  1. 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.
  1. 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:

  1. Add more mailboxes to your campaign — Go to Campaign Settings and assign 3-5 mailboxes. Use mailbox rotation (round-robin) to distribute load.
  1. Reduce daily campaign volume — Lower your per-campaign daily send limit to match your available mailbox capacity.
  1. 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.
  1. 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.

Why prospects might fail and how to fix

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:

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

LinkedIn endorsement step skipping — no endorsable skills found

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:

  1. The prospect has not listed any skills on their profile
  2. The prospect's skills don't have endorsement IDs (rare technical issue)
  3. 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.

Cannot delete LinkedIn message — 60 minute window expired

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:

  1. Send a follow-up correction message
  2. 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.

Can I use LinkedIn without a paid subscription?

No — the LinkedIn add-on requires an active paid subscription (any paid plan). Free-tier users cannot purchase or use LinkedIn seats.

To get started with LinkedIn:

  1. Upgrade to a paid plan from the Billing page
  2. Purchase LinkedIn seats ($12/month per seat)
  3. Connect your LinkedIn account

If you're on a free plan, you'll see a locked LinkedIn card on the Billing page with an option to upgrade.

What happens to LinkedIn if I cancel my main subscription?

If your main subscription is canceled or becomes inactive, your LinkedIn add-on is also affected:

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.

How do I cancel just the LinkedIn add-on?

To cancel only your LinkedIn add-on (without affecting your email plan):

  1. Go to the Billing page
  2. Scroll to the LinkedIn Prospecting Add-On section
  3. Click 'Cancel Add-On'
  4. Confirm the cancellation

What happens when you cancel:

You can reactivate LinkedIn at any time from the Billing page. Reactivation restores your previous seat count and billing resumes immediately.

How do I create additional workspaces?

Your first workspace is created automatically when you sign up. To create additional workspaces (available on Enterprise and Ultimate plans):

  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 and click Create

Workspace limits by plan:

Key details:

Pro plan users: Upgrade to Enterprise ($69.99/month) from the Billing page to unlock multiple workspaces.

How does billing work with multiple workspaces?

Your subscription plan covers your entire account, including all workspaces you own:

Workspace limits by plan:

Example — Agency on Enterprise ($69.99/month) with 3 workspaces:

Can someone other than the workspace creator pay for the plan?

Yes. The plan belongs to the workspace, not to one person — so whoever pays, everyone in that workspace gets the plan.

Who can pay
The workspace owner or any admin can buy the plan. Paying does not change anyone's role: the owner stays the owner, and an admin who pays stays an admin. It also does not move anyone between workspaces.

One workspace, one plan
A workspace can only be on one plan at a time. If someone in your workspace has already paid, checkout will let the others know instead of charging a second card — so a team can't accidentally end up paying twice for the same workspace.

If you have more than one workspace, each is a separate plan. Buying a plan applies it to the workspace you are currently in, so switch to the workspace you want covered before you subscribe.

What everyone in the workspace gets
Once the workspace is on a paid plan, every member works under it — sending, warmup, LinkedIn and Instagram all run on the workspace's plan. Nobody else needs to buy anything of their own.

Example
You create the workspace and invite a colleague as an admin. Your colleague pays for Pro. The workspace is now on Pro, both of you have full access, you are still the owner, and your colleague is still an admin. Pro covers 2 team members, so if you want a third person you would move up to Enterprise, which covers 4.

Billing details stay private
Payment details and invoices are only visible to the person who bought the plan. Other members see that the workspace is on a paid plan, not who paid or what card was used.

If something looks wrong
If you have paid and the workspace still looks like it is on no plan, reply to us with the email address you paid with and we'll sort it out.

Why does my Open Rate or Click Rate exceed 100%?

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.

How are Out of Office replies handled?

When a mail server answers your campaign email instead of a person — an out-of-office notice, a vacation autoresponder, or a 'we have received your request' acknowledgement — WarmySender recognises it and does not treat it as a reply. Your sequence keeps running, and your reply rate is not inflated by it.

Automatic detection:
We look at the hidden markers mail systems attach to auto-responders, at the shape of the subject line, and at the wording of the message. Out-of-office phrasing is covered explicitly in English, Dutch, German, French and Spanish; the hidden markers are recognised whatever the language.

An out-of-office reply does not end the sequence:
It is treated as 'this person is away, not saying no'. The follow-ups keep going out on their normal schedule, so you do not lose the lead and you do not burn a follow-up on a message nobody read. It is also excluded from your reply statistics.

If one slips through (rare):
Occasionally an unusual phrasing — an internal custom auto-reply, or a language we do not yet cover — is read as a genuine reply and the sequence stops. Two ways to put it right:

  1. In the campaign: open the Prospects tab, find the person, open the actions menu on their row and choose 'Resume sequence'. They rejoin at the next step they have not received yet.
  1. In your Inbox: open the message and change its label to 'Auto-Reply / Out of Office'. The sequence picks up again on its own and the message stops counting towards your reply rate.

Either way, emails already sent to that person are never sent again, and nothing goes out immediately — the next step is scheduled at your normal pace.

Best practice:
If the same phrasing keeps being read as a real reply, send it to [email protected] so we can improve coverage. Detection is refined from real examples.

For the full picture — including what happens to genuine replies, ticket acknowledgements, and how your reply rate is calculated — see /documentation/does-an-out-of-office-reply-stop-my-campaign.

How many mailboxes can I connect and warm up?

Connected mailbox limits by plan (account-wide, across all your workspaces):

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.

What does 'team members' or '2 members' mean?

Team members refers to the number of people who can access your WarmySender workspace. Each member gets their own login account.

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:

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.

Can I manage multiple domains and mailboxes in one workspace?

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:

Key points:

When to use multiple workspaces instead:

My free trial expired — what happens now?

When your 7-day free trial expires without subscribing, your account is downgraded to a restricted state:

To re-activate your account:

  1. Log in to WarmySender
  2. You'll see the Billing page with available plans
  3. Subscribe to Pro ($14.99/mo), Enterprise ($69.99/mo), or Ultimate ($199/mo)
  4. Your account is immediately unlocked
  5. Resume your paused campaigns and warmup

Your data is safe — subscribing restores full access to everything you set up during the trial.

How do I upgrade or downgrade my plan?

You can change your plan at any time from the Billing page.

To change your plan:

  1. Go to the Billing page (click your profile > Billing, or navigate to /billing)
  2. Click 'Change Plan'
  3. Select your new plan
  4. If you have a promo code, enter it to see the discounted price
  5. Confirm the change

Upgrading:

Downgrading:

If you are on a free trial (no credit card on file), changing plans will take you through a full checkout process.

I exceeded my monthly email limit — what happens?

When you reach your monthly email quota, campaign sending pauses automatically until your quota resets at the start of your next billing cycle.

Monthly quotas by plan:

What happens:

Options to resolve:

  1. Wait for your next billing cycle — your quota resets automatically when your subscription renews
  2. Upgrade your plan — higher plans take effect immediately with the new quota
  3. Add more mailboxes and stagger campaigns across billing cycles to stay within limits

To check your current usage, visit the Billing page. Daily limits also apply: Pro ≈ 333/day, Enterprise ≈ 3,333/day, Ultimate ≈ 10,000/day.

How does LinkedIn add-on billing work?

The LinkedIn add-on is a separate subscription billed at $12/seat/month (or $120/seat/year — 17% 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 $12/seat/month, or $120/seat/year (17% off).

Key details:

Adding LinkedIn seats:

  1. Go to the Billing page
  2. Click 'Add LinkedIn Seats' (or manage existing seats)
  3. Choose how many seats you need
  4. Payment is processed via Stripe

Canceling LinkedIn seats:

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.

How do I apply a promo or discount code?

You can apply a promo code when subscribing or when changing your plan.

During initial checkout:

When changing plans (existing subscribers):

  1. Go to the Billing page
  2. Click 'Change Plan'
  3. Select your new plan
  4. Enter your promo code in the promo code field
  5. 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.

Can I get a refund?

For refund requests, please review our Refund Policy at warmysender.com/refund-policy.

General guidelines:

To avoid unwanted charges:

What payment methods are accepted? Where are my invoices?

Payment Methods:

Invoices & Billing History:

Updating Your Payment Method:

  1. Go to the Billing page
  2. Click 'Manage Subscription' or 'Update Payment Method'
  3. Enter your new card details in the secure Stripe form
  4. Your next charge will use the updated card

Do you offer annual or yearly pricing?

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):

Monthly Pricing:

How the limited-time 55% annual offer works:

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.

Why does my LinkedIn campaign say 'paused' with no reason?

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:

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.

I imported Sales Navigator URLs but most of my prospects didn't get invites — what happened?

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:

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.

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 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.

I see prospects who replied on LinkedIn but my dashboard says 0 replies — what's wrong?

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:

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.

Many of my prospects say 'Profile inaccessible' — are they lost?

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:

A platform-wide audit found 21,868 prospects discarded this way.

The fix defers instead of discarding:

What you should do:

No manual recovery is needed for the 21,868 affected prospects — that was handled for you.

I imported a CSV with custom fields but my template variables show 'undefined' — what should I do?

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:

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:

No LinkedIn actions were attempted for the affected prospects, so there is no cost against your limits for retrying.

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 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:

What WarmySender does during the outage:

  1. The 15-minute health monitor raises a high-severity internal alert within one check of the outage starting.
  2. The 30-minute polling fallback keeps pulling inbound messages so we retain a complete record of what arrived. This is cover, not a fix.
  3. 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:

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.

Why are some of my prospects shown as accepted but never received a follow-up message?

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:

  1. 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.
  2. 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.
  3. 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.

Why are my campaign stats showing zero accepts when I have replies?

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:

If you still see the issue:

No extra LinkedIn calls are involved in any of this — every fix works on signals we had already received.

I see a 'Template syntax invalid' error — what do I do?

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:

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.

Why is my LinkedIn campaign stuck or showing wrong numbers?

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:

What to do if your campaign is auto-paused:

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'.

Why is my account counter different from what the campaign shows?

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:

How to verify the messages actually went out:

  1. Open the campaign card and check the per-step activity counter — that's the real number.
  2. Open the LinkedIn inbox for the account and confirm the messages are visible in your sent items.
  3. 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.

Why is my campaign stuck on a condition step?

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.

Why isn't my LinkedIn campaign sending?

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.

  1. 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].

  1. 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.

  1. 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:

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.

  1. 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.

  1. 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.

  1. 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.

  1. 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 suspect a missed LinkedIn accept

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.

Why can't I resume my campaign? (No prospects with LinkedIn URL)

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

How to verify in the UI

  1. Open the campaign and check the status pill. running means active; paused shows a reason.
  2. 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.
  3. On the LinkedIn account card, check ramp week (1-4) and remaining daily / weekly headroom.
  4. Open the Activity tab on a prospect for the full audit trail of attempts and errors.

How LinkedIn webhooks work end-to-end

Configuration

  1. Settings › Webhooks › New Webhook. Paste your endpoint URL (Slack Incoming Webhook, Zapier Catch Hook, n8n / Make HTTP Trigger, or your own HTTPS endpoint).
  2. Pick the events: linkedin.invite_accepted, linkedin.message_sent, linkedin.reply_received, linkedin.account_disconnected. Subscribe to * for everything.
  3. Click Test webhook — WarmySender fires a sample linkedin.invite_accepted payload to your URL.

Sample payload (linkedin.invite_accepted)

{
  "event": "linkedin.invite_accepted",
  "id": "evt_2026_04_27_aa11bb22cc33",
  "occurredAt": "2026-04-27T11:32:14.512Z",
  "workspaceId": "ws_abcdef0123456789",
  "data": {
    "campaignId": "camp_8c2f...",
    "prospectId": "prs_4a7b...",
    "linkedinAccountId": "lia_9d11...",
    "invitedAt": "2026-04-17T13:57:01.000Z",
    "acceptedAt": "2026-04-27T11:32:14.000Z"
  }
}

Sample payload (linkedin.reply_received)

{
  "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

What you'll see in your activity history

Every send is recorded with a structured entry your support team can reference:

[InMail] account=... recipient=... conversation=... deliveryProven=true

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 typeInMails / dayConnection invites / weekNotes
Free0 (no InMail credits)100 / week capped by rampCold messaging only via accepted connections.
Premium25100 / week capped by rampDefault conservative paid tier.
Sales Navigator50100 / week capped by rampBest for cold outreach to non-connections.
Recruiter / Recruiter Lite50100 / week capped by rampRecruiter-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.

4-week safety ramp

If LinkedIn restricts an account, we automatically put it back on the gentlest pace and start the easing-in again from week one, so the account rebuilds 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

  1. 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.
  2. 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.
  3. Your chosen pace. Separate from the ramp above, and chosen when you connect the account based on how old and how active it is: a brand-new account eases in over about six weeks, an established one over about four, a long-standing one over about two, and an account recovering from a restriction takes the longest at around eight. You can also set your own pace, which skips the easing-in entirely. Your pace limits invites, messages, InMails, profile views and engagements per week, and whichever is lower — the ramp or your pace — is the one that applies.
  4. The daily amount you set on the campaign. The per-campaign budget you choose in the wizard. It counts every action together — one invite + one message + one InMail uses three of that day’s budget.
  5. A separate ceiling for each action type. Invites, messages, InMails and profile views each have their own daily ceiling on top of the campaign budget. Reaching one of them holds back ONLY that action type — the campaign carries on sending the others.
  6. The weekly invite ceiling on the account. Around 100 invites a week, and a Sales Navigator account can stretch further. The week resets every Monday at 00:00 UTC. This is the most common reason for “my campaign has gone quiet until next week”.
  7. InMail credits. Sales Navigator includes 50 InMail credits a month, Premium includes 5, Recruiter 100+. When LinkedIn says there are no credits left, we pause InMail steps on that account until LinkedIn refills them (the top of the next calendar month on Sales Navigator). Invites and regular messages keep flowing throughout, and InMails restart on their own.
  8. A safety rest after LinkedIn signals a limit. When LinkedIn tells us an account has hit one of its limits, we pause every action type on that account for a few hours so it can rest. Sending restarts automatically — you do not need to do anything. Trying again during the rest only extends it, because each further attempt counts against the account. Full explanation: Why did my LinkedIn invites pause today?

Worked example — a long-standing Sales Navigator account, week 4

You have one Sales Navigator account set to the fastest pace (its two-week easing-in is finished) and a campaign set to 50 a day, running invite-only steps, Mon-Fri, 09:00-17:00 UTC.

Cap layerValueEffective per day
LinkedIn safe rate (Sales Nav, paid)100 invites / week~14 / day (spread)
Account-type ramp (week 4)50 invites / day50 / day
Your chosen pace (fastest, week 4)200 invites / week29 / day
Weekly invite ceiling on the account200 / week29 / day
Daily invite ceilingthe weekly figure spread over 7 days29 / day
The daily amount you set on the campaign50 / day50 / day
The one that appliesthe lowest row29 invites / day

The Throttle Diagnostic panel will say: “Daily invite cap reached — resumes tomorrow at midnight UTC” once 29 invites have gone out, even though the campaign is set to 50. The narrowest limit always wins. Raising the campaign to 100 a day would NOT help — your pace and the weekly ceiling still top out at 29 invites a day. To send more: (a) wait for the easing-in to finish and the weekly ceiling to widen, or (b) add MORE LinkedIn accounts to the campaign, so each one works within its own allowance.

Common diagnostic outputs & what to do

What the panel saysWhat to do
Daily send limit reachedWait — it resets at midnight UTC. To raise it, edit the campaign and increase the daily amount, but that only helps if the per-action and weekly ceilings still have room.
Invite cap reached for this weekWait until Monday — the week resets at 00:00 UTC. Or add another LinkedIn account to the campaign, since each one has its own weekly allowance.
InMail credits exhaustedTop up credits in LinkedIn. Sales Navigator refills 50 a month at the top of each calendar month. InMails restart on their own — on the first one that goes through, or when the month rolls over. InMail steps are skipped meanwhile; invites and messages keep flowing.
View profile cap reachedWait — it resets at midnight UTC. Viewing a profile is a gentle action, and campaigns rarely rely on it as a required step.
Account on conservative ramp (week N of M)Wait one calendar week, or change the pace under Settings › LinkedIn. Moving a brand-new account to the fastest pace mid-flight is allowed, but it raises the risk of a restriction on accounts less than six months old.
Account in LinkedIn cooldownWait — do NOT retry by hand. Every attempt during the rest period extends it. The panel shows the exact time sending restarts, and it restarts on its own. See Why did my LinkedIn invites pause today?
Sending normallyNo action. The campaign is going as fast as it safely can. To send more: add more LinkedIn accounts, or wait for the easing-in to finish.

Why the panel names only ONE limit

People used to see a campaign’s daily budget only 30% used, assume something was broken, and write in — when in fact a different, lower limit (usually the weekly invite ceiling) was the real one holding things back. So the panel deliberately names ONE limit, choosing the one that holds sending back for the longest: a safety rest first, then the weekly ceiling, then the daily one, then the easing-in. The per-action rows underneath let you check the arithmetic yourself.

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.

Related

Acceptance vs reply tracking

Definitions

Example timeline A — accepted, then a follow-up message, then a reply

Day 0  09:00   Step 1 invitation sent
Day 2  14:12   Accepted
Day 3  09:00   Step 2 follow-up message sent
Day 5  17:42   They replied

At Day 5: accepted = 1, replied = 1, time from accept to reply = 3d 3h

Example timeline B — the reply reaches us before the acceptance does

Day 0  09:00   Step 1 invitation sent
Day 0  09:18   Reply reaches us at 09:18:42; acceptance at 09:18:48

Both are recorded:
  Accepted  09:18:48
  Replied   09:18:42

When someone accepts and replies within seconds, the two signals can reach us in either order. Both are still recorded, so your accepted and replied counts are both right. The prospect’s status shows replied rather than connected, because replying is further along than connecting — the counts and the status are tracked separately, so neither one loses information.

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 tierRecommended daily limitWhy
Free75/dayConservative ramp; no InMails; LinkedIn watches free-account volume closely.
Premium150/dayHeadroom for invites + messages + profile views; ~5 InMail credits per month.
Sales Navigator250/day200 invites/week + 100 profile views/day + up to 50 InMails/day fits inside.
Recruiter250/daySame 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 }}.

Supported merge tags

TagDescriptionExample
{{first_name}}Contact's first nameJohn
{{last_name}}Contact's last nameDoe
{{email}}Contact's email address[email protected]
{{company}}Contact's company nameAcme Inc
{{title}}Contact's job titleCEO
{{city}}Contact's cityNew York
{{country}}Contact's countryUSA
{{industry}}Contact's industryTechnology
{{sender_name}}Sender's display nameSales Team
{{sender_email}}Sender's email address[email protected]
{{sender_company}}Sender's company nameAcme Inc
{{signature}}Mailbox email signatureBest regards, John
{{company_address}}Company physical address (CAN-SPAM)123 Main St, City, ST 12345
{{campaign_name}}Campaign nameQ1 Outreach
{{custom.fieldName}}Any custom field on the prospect (from CSV){{custom.icebreaker}}

Aliases

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. It goes up by one every time a warmup message successfully leaves that mailbox. It resets to zero at your mailbox's local midnight — not at global UTC midnight — so a Pacific-time mailbox rolls over at 00:00 PT (08:00 UTC) and an Australian mailbox at 00:00 AEST (14:00 UTC the day before). It only ever resets once per day, whatever else is happening.

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 pausedWhat it meansHow to resume
Your free trial endedWarmup 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 outstandingYour 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 endedThe 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 workingThe 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 failuresSeveral 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 offYou, 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 every channel on the platform — cold email campaigns, email warmup, LinkedIn, Instagram, 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 amount grows over time

A brand-new mailbox does not start at the daily amount you set. It starts low — typically 5–10 messages on day one — and climbs a little each day toward your target. How quickly it climbs depends on the situation the mailbox is in and on how healthy it has been (spam rate, bounce rate, and where its mail lands):

Once a mailbox reaches steady maintenance — roughly 14 days in, with clean health — its daily amount settles at the target you set. If its health slips, we lower the daily amount by ourselves for a while. That is deliberate protection, not a fault, and it lifts again as the numbers recover. More detail: How email warmup ramps up, how to control your warmup sending volume, and why your warmup volume went down.

Sending vs receiving — what the Inbox Rate does and does not tell you

Your Inbox Rate is a sending score. It measures the warmup mail this mailbox sent and how much of it landed in the main inbox of the people receiving it. It says nothing at all about what arrives at this mailbox. Those are opposite directions, and they are measured separately.

That is why a mailbox can honestly read 99% and "Excellent" while nothing has arrived at it for two weeks. Both facts are true at once: its outgoing mail is landing beautifully, and its incoming side is stalled. The sending score is still the number that predicts whether your cold email campaigns reach the inbox — it is just not the answer to "am I receiving?".

To answer that one, read the note on the individual mailbox rather than the headline score:

The whole picture, with worked examples: My inbox rate looks great but I’m not receiving warmup emails and Understanding your warmup Inbox Rate.

When numbers look surprising — quick diagnostic checklist

  1. Check the time zone. If "Sent today" looks higher than expected, confirm the mailbox's time zone setting matches where you actually are — the wrong time zone can make "today" stretch across up to 48 hours of real sends.
  2. Wait until end-of-day. Deliverability % grows throughout the day as detections complete. Morning numbers under-report; end-of-day numbers are accurate.
  3. Read the pause reason. If sends are zero, the per-mailbox detail page shows exactly why — match the reason against the table above.
  4. Reconnect if needed. Almost every technical pause clears with a successful Reconnect from the Mailboxes page; you do not need to contact support first.
  5. 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.

Visit our Email Warmup FAQ, Deliverability FAQ, or LinkedIn Safety FAQ for more answers.

For API integration, see our API Documentation.

Frequently asked questions

How do I connect my email account to WarmySender?

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 ($12/seat/month), then go to LinkedIn > Connect Account. You can connect with a browser cookie or with your LinkedIn email and password. Everything runs on our servers, so there is no browser extension to install and nothing plugs into your browser session.

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: the LinkedIn account disconnected part-way through, too many errors in one day (we stop enrichment for the day to protect your account), or the 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 every channel on the platform: cold email campaigns, email warmup, LinkedIn, Instagram, 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].