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

Prospects & Data

Platform

Integrations

SEO & Content

SEO

Performance

Billing & Plans

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 60 tools available — across email, LinkedIn, Instagram, warmup, verification, tracking domains, and your leads database — and every one is safety-checked. Account safety always wins over speed.

Frequently Asked Questions

Do I still need to connect my mailbox myself?
Yes — just once. Connecting your inbox and turning on warmup are the only steps that stay in the app, because they involve your real email accounts. After that, an AI can drive the rest. See /documentation/connecting-mailbox.

Can it run LinkedIn and Instagram too, or only email?
All three. The same AI assistant can create and launch cold email campaigns, LinkedIn connection and message campaigns, and Instagram DM campaigns, then report back on how each one is performing.

Is it safe — could the AI get my account banned?
No. The AI only queues the work; our scheduler decides when each invite, message, or email actually goes out, always within your ramp and your daily and weekly caps. It never sends directly and can never raise a limit, so your accounts stay inside safe boundaries.

Which AI tools work?
Any MCP-compatible client — Claude Desktop, Claude Code, ChatGPT, Codex, Cursor, Windsurf, Zed, Perplexity, and more. Install steps: /documentation/mcp-install and /ai-agents.

Is there an extra cost?
No. AI automation over MCP is included with any active paid plan. Your usage simply counts toward the normal fair-use rate limits.

Next steps: connect a mailbox (/documentation/connecting-mailbox) and start warmup, then connect your AI (/documentation/connect-your-ai-agent), skim the MCP overview (/documentation/mcp-overview) and the install guide (/documentation/mcp-install). Brand new to outreach? The 15-minute Quick Start (/documentation/quick-start-campaign) and Getting Started (/documentation/getting-started) cover the basics.

Take the Product Tour (60-second guided walkthrough)

The fastest way to get your bearings in WarmySender is the 60-second guided tour. It walks you through every part of the app and introduces the four things WarmySender does best: Cold Emailing (build multi-step email campaigns that send gradually and stop the moment someone replies — the #1 use case), Email Warmup (quietly builds and protects your sender reputation so emails land in the inbox, not spam), LinkedIn Outreach (connection requests and follow-up messages at a safe, natural pace), and Multichannel (mix email, LinkedIn, and Instagram DMs into one sequence).

Take the tour: The first time you sign in, a Welcome screen appears with a 'Take the 60-second tour' button. Click it and the tour spotlights each area of the app one step at a time — dashboard, mailboxes, warmup, prospects, find & verify emails, campaigns, templates, LinkedIn, Instagram, the unified inbox, analytics, and AI Agents — with a short note about what each does. Use Next, Back, or Skip at any point. The tour is optional and read-only; taking it never changes anything in your account.

Replay it anytime: Click the 'Tour' button (sparkles icon) in the top header of the app, or open Settings and start the tour from there. Many individual pages also show their own short tour the first time you visit them, so help appears right where you need it as you explore.

In your language: WarmySender is available in 10 languages, and the app — including the guided tour — follows your chosen language. Set it in Settings.

Full walkthrough with screenshots of every area: see the Getting started: take the WarmySender product tour guide at /documentation/getting-started-product-tour.

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 each billing cycle):

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 plan — no credit card required.

What You Get During the Trial:

How to Start Your Trial:

  1. Sign up at warmysender.com
  2. Click 'Start 7-Day Free Trial' on the Pro plan
  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:

Editing a Mailbox's Daily Sending Limit

You can adjust a mailbox's daily sending limit at any time without disconnecting or reconnecting the mailbox. The change is live and takes effect on the very next scheduler tick — no campaigns are disrupted, no authentication is re-requested, and no in-flight sends are lost.

Where to Find It
1) Go to the Mailboxes page.
2) Find the mailbox row you want to adjust.
3) Click the row's dropdown menu (the '...' or gear icon) and select 'Edit Daily Limit'.
4) The same option is available from the mailbox's View Details page if you prefer a fuller view before editing.
5) Enter the new daily limit and save. The value is stored on the mailbox's `dailyLimit` field and is picked up immediately by the next scheduler cycle.

Recommended Ranges
• Brand-new mailbox (first 2 weeks): 20-30 emails/day. Stay conservative while warmup builds reputation.
• Warmed-up mailbox (health score 70+, 2+ weeks of warmup): 50-100+ emails/day is safe. Increase gradually, not all at once.
• Never exceed 500/day per mailbox — that is WarmySender's global per-mailbox hard cap and the practical ceiling for any single inbox.

How It Interacts With Campaign-Level Caps
WarmySender enforces THREE sending caps and the MINIMUM of the three always wins. Sends stop the moment the first cap is hit:
• Mailbox `dailyLimit` — the value you set on this page.
• Campaign `dailySendLimit` — a cap per campaign across all of its mailboxes.
• Campaign-mailbox `maxSendsPerMailboxPerDay` — a cap on how much a single mailbox can send for a single campaign.

Example: mailbox limit 100, campaign limit 50, per-mailbox-per-campaign limit 30 → only 30 sends will happen through that mailbox for that campaign today.

Warmup Traffic Is Counted Separately
Warmup sends use the `warmupTargetDailyVolume` field, not `dailyLimit`. Raising or lowering your campaign daily limit does not affect how many warmup emails your mailbox sends. To adjust warmup volume, go to the Warmup settings for the mailbox instead.

Changes Apply to the Current Day
The daily limit is enforced against today's running send count. If the mailbox has already sent 25 emails today and you raise the limit from 25 to 30, it can still send 5 more today. If you lower the limit below the current count, sending simply pauses until tomorrow — no error, no disruption.

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 Pro plan, no credit card is required, and it switches on within a second or two of you signing up. Starting a trial sends no email, touches no LinkedIn or Instagram account, and cannot affect anyone's sender reputation — the worst case is a short wait.

If your dashboard still looks locked a minute later, three steps in order:

  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: the Pro plan's cold email and email warmup features — connecting mailboxes, warming them up, and building and running campaigns. Two things sit outside it: the email verifier is not part of the trial, and LinkedIn and Instagram are separate add-on seats rather than something the trial turns on.

What happens at the end: nothing is charged and there is nothing to cancel. If you have not chosen a plan by then, your account moves into a restricted state rather than a free plan — you can still sign in and every mailbox, campaign, prospect, template and statistic is preserved, but campaigns stop sending and email warmup pauses until you pick a plan. Choosing one switches both back on within a few minutes, with your warmup progress kept, so the ramp does not restart at day one.

Full explainer with a worked example: /documentation/trial-activation

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, and the most common setup typos.

Full explainer: /documentation/connect-gmail-workspace-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 three usual causes: the spaces Google shows in the password were pasted in, Google is running a quick one-time security check on the new password, or the normal login password was used instead of the App Password.

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

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 to ensure warmup emails always end up in your inbox — even when email providers initially route them to spam.

How Spam Rescue Works
During regular IMAP scans, WarmySender checks both your inbox and your spam/junk folders. When a warmup email is found in spam, the system identifies it using internal tracking tokens and automatically moves it back to your inbox.

Why This Matters
Every time a message is moved from spam to inbox, it sends a strong signal to your email provider (Gmail, Outlook, Yahoo, and others) that emails from that sender are legitimate and wanted. Over time, these signals train the provider's spam filters to trust your domain, improving your overall inbox placement rate.

Automatic and Hands-Free
Spam rescue happens entirely in the background — you do not need to manually check your spam folder or move any emails. The system handles detection and rescue automatically during each scan cycle.

Impact on Your Health Score
Your inbox placement rate — including emails successfully rescued from spam — contributes directly to your mailbox health score. A high rescue success rate helps maintain a strong score, while emails that remain undetected in spam would lower it.

Works Across All Providers
Spam rescue is compatible with all connected email providers, including:
• Gmail and Google Workspace
• Outlook and Microsoft 365
• Yahoo Mail
• Any custom IMAP-compatible email service

The system adapts to each provider's folder structure and naming conventions (Spam, Junk, Bulk Mail, etc.) to ensure comprehensive coverage.

No Configuration Required
Spam rescue is enabled by default for all mailboxes with warmup active. Simply connect your mailbox, enable warmup, and the system takes care of the rest.

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

How Email Warmup Ramps Up

How WarmySender's email warmup ramps up gradually across your first hour, first day, and first week. Why both sending AND receiving are capped on a new mailbox, what the day-1 / day-7 / day-14 volume targets are, and why mature warmup providers control receive-side rate just as carefully as send-side rate. Practical answers to 'why don't I see emails yet?' and 'can I skip the ramp?'

Full explainer: /documentation/how-warmup-ramps-up

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

Warmup Shows Active but No Emails Are Arriving

Why one of your mailboxes can show warmup as active while incoming warmup emails briefly slow or stop arriving, what the 'Incoming warmup catching up' note means, and why no action is needed. Your sending keeps working normally, WarmySender detects and restores incoming warmup automatically, and it usually resolves on its own within a few days.

Full explainer: /documentation/warmup-shows-active-but-no-emails-arriving

Why 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 to Control Your Warmup Sending Volume

Where to find WarmySender's warmup volume controls and how to use them: set a target daily volume (10-100 emails per day, per mailbox), choose a Conservative, Normal, or Aggressive ramp, and adjust several mailboxes at once. Included on every plan and during your free trial — no separate upgrade. Why warmup always ramps within built-in safety limits that protect your deliverability.

Full explainer: /documentation/how-to-control-your-warmup-sending-volume

How 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 Warmup Emails Are Spread Through the Day

WarmySender sends your warmup emails spread naturally across the day — the way a real person sends email — instead of firing them all in one burst. A burst of mail at a single hour looks automated to inbox providers; a natural spread looks human, which protects your sender reputation and keeps deliverability strong. You still get the same daily amount, just paced across the day, and you can see the next scheduled send time for each mailbox on your dashboard.

Full explainer: /documentation/why-warmup-emails-are-spread-through-the-day

Why Warmup Shows Only a Few Emails Early in the Day

If you check your warmup early in the day and see only a few emails sent so far, that's normal — nothing is broken. WarmySender spreads each day's warmup emails across the whole day (morning to evening) on purpose, so an early count is partial and keeps filling in. The daily amount also ramps up gradually over your first few weeks to protect deliverability, so early days are intentionally small. Worked example: seeing 2 of 5 at 5 AM is expected — the rest send later today.

Full explainer: /documentation/why-warmup-shows-few-emails-early-in-the-day

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

Campaigns

Setting Up Your First Campaign

To create and launch your first email campaign:

  1. Prerequisites — Make sure your mailbox is connected, warmup has been running for 2-3 weeks, and your Health Score is above 70. Set up SPF, DKIM, and DMARC DNS records for your sending domain.
  1. Create Campaign — Go to Campaigns, click 'Create Campaign', and select 'Email Campaign' (you can also choose LinkedIn or Multichannel if you have LinkedIn seats).
  1. Add Prospects — Import contacts via CSV file, paste data directly, add individually, or select from an existing prospect list. You can also use prospects saved from the Leads Database.

4) Write Your Sequence — Create your email steps:

  1. Configure Sending — Set your daily sending limit (start with 20-30/day), sending window (time of day + timezone), and active days (default: Mon-Fri). Assign one or more mailboxes to the campaign.
  1. Review & Launch — Preview your emails with sample data, verify settings, and activate the campaign.
  1. Monitor — Watch your campaign analytics: open rates, reply rates, bounce rates. Check Unified Inbox for replies. The system auto-pauses if safety metrics are violated (high bounce rate, spam complaints).

Best practice: Start with a small batch (50-100 prospects) to test your messaging before scaling up. Aim for: Open rate 40%+, Reply rate 5%+, Bounce rate below 3%.

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 ($15/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 Emailing, LinkedIn Outreach, and Multichannel sequences that combine both. The check covers subject lines, message bodies, LinkedIn invitation notes, and InMail subject lines. The Preview pane in the step editor is the best way to catch missing-data issues before reaching the launch dialog: switch the prospect selector through a few different prospects in your audience — if any show a blank where a custom field should be, that prospect's data is missing. See /documentation/why-launch-shows-some-prospects-missing-template-data for the full guide with worked examples and frequently asked questions.

Merge Tags & Personalization

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

Built-in Tags:

LinkedIn-Specific Tags (in LinkedIn campaigns):

Sender Tags:

Custom Fields:
When importing prospects via CSV, any column not matching a built-in field becomes a custom field. For example, a CSV column 'department' maps to custom:department, and you can use it as {{custom.department}} or {{department}} in your emails. The {{custom.department}} syntax is recommended (and what the variable picker inserts), but the bare {{department}} shorthand also works.

Custom Fields in Subject Lines:
Custom fields from your CSV work everywhere — including the subject line. If you import a CSV with a custom:subject_line column, you can set your entire subject to {{custom.subject_line}} or {{subject_line}}. For fully pre-written emails, your subject line could be just {{custom.subject_line | default: 'Quick question'}} — each prospect gets their own unique subject.

Fallback / Default Values (two ways to write them):
A fallback is the value used when a field is empty or missing for a prospect — perfect for a column that's only partly filled in. WarmySender supports two ways to write it, and they do exactly the same thing, so use whichever reads more naturally to you:

1) Long form (the classic way):

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

More examples you can copy and paste:

Good to know about the short form:

Best Practices:

Spintax — Dynamic Text Variations

Spintax lets you create multiple text variations within a single email, so every recipient gets a slightly different version. This improves deliverability by making each email unique and helps avoid spam filters.

Syntax:
Wrap your alternatives in curly braces, separated by pipes:
{Hello|Hi|Hey} — randomly picks one option per send.

Works In:

Examples:
Subject: {Quick question|Reaching out|Short intro} about {{company}}
Body: {Hope you're doing well|Hope your week is going great}, {{firstName}}. {I wanted to reach out|I'm reaching out|I noticed your work} {about|regarding} {a potential collaboration|an opportunity I think you'd find interesting}.

Multiple spintax blocks multiply your variations:

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

Spintax vs Merge Tags:

Preview & Testing:

Processing Order:
1. Merge tags are resolved first ({{firstName}} → 'Scott')
2. Spintax is resolved second ({Hi|Hello} → 'Hello')
3. HTML formatting is applied last

Best Practices:

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.

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 Complaint Protection:

Reply Rate Floor (optional):

Cooldown & Recovery:

Mailbox Auth Protection:

Host Circuit Breaker:

Watchdog System:

Best Practices:

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

Why is my campaign 'running' but no emails sent yet?

You just launched a cold email campaign, the status says 'running', but the Sent count still shows 0. Almost always, this is completely normal — and nothing is broken. WarmySender sends your campaign gradually rather than all at once, so right after launch you may see a short stretch of 'running' with little or nothing sent yet while the first emails go out and the rest are paced through the day.

Why campaigns send gradually (and not all at once):
Sending a whole list in one burst is one of the fastest ways to land in spam and hurt your domain's reputation. Real people don't fire off hundreds of identical emails in the same minute, and mailbox providers notice when a sender does. To keep you in the inbox, WarmySender deliberately spreads your sends out:
• Across your sending window — for example 7am to 5pm. Emails are paced through those hours instead of going out in a single spike.
• Across your send days — for example weekdays only. On a day you didn't select, the campaign simply waits.
The result is a natural, human-looking sending rhythm that protects your deliverability and your domain reputation over the long run. It's intentional — not a delay or a bug.

The first emails start promptly after launch:
You don't have to wait long to see things move. Right after you launch (or resume) a campaign, the first few emails begin going out within a couple of minutes — as long as the current time is inside your sending window and it's one of your send days. The remaining emails are then paced out across the rest of the day. So the typical experience is: launch, see 'running' with 0 sent for a brief moment, then watch the first sends land within a few minutes and the count climb through the day.

Look at the 'Next email' time:
The clearest way to confirm your campaign is working is the 'Next email ~time' shown on the campaign. It tells you when the next message is scheduled to go out. If you see an upcoming time there, your campaign is healthy and simply pacing — there's nothing to fix. If that time is later in the day, it just means your sending is spread out, exactly as designed.

What affects how fast your campaign sends:

If it still shows nothing after a while:
If your sending window has been open for a while and you still see no sends, check:
1) The campaign has contacts — open the Prospects tab and confirm people are enrolled.
2) At least one mailbox is connected and active — a campaign needs a connected sending mailbox; if your only one is disconnected, reconnect it and the campaign picks back up automatically.
3) The current time is inside your sending window and on a send day — if 'right now' is outside your chosen hours or on a day you didn't select, sending waits until the next valid time (the 'Next email ~time' shows when).
If you've checked all three and it still looks stuck, just reply to our support with your campaign name and we'll take a look.

Full walkthrough with examples: warmysender.com/documentation/why-is-my-campaign-running-but-no-emails-sent-yet

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.

Images in Campaign Emails

WarmySender supports inserting images into your campaign emails using the Insert Image button in the email editor toolbar.

How to Insert an Image:
1. In the campaign email editor, click the Image icon (mountain/sun icon) in the toolbar.
2. Paste the URL of your image (must be a publicly accessible HTTPS URL).
3. Optionally add alt text (recommended for accessibility and email clients that block images).
4. Optionally set a width (e.g. 600 for full-width, 300 for half-width).
5. Click 'Insert Image' — the image appears inline in your email.

You can also insert images in code view by typing an <img> tag directly, for example:
<img src="https://yoursite.com/image.png" alt="Description" width="600" />

Where to Host Your Images:
Images must be hosted on a publicly accessible URL. You do not upload images to WarmySender — instead, host them on your own website, a CDN, or a free image hosting service:
• Your company website or CDN (best option for brand consistency and reliability)
• Google Drive (set sharing to 'Anyone with the link', then use the direct link)
• imgbb.com (free, no account required)
• Imgur (free for public images)
• Any web server that serves images over HTTPS

Image Best Practices for Cold Email:

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. Signatures support both plain text and HTML, so you can include formatted text, links, or simple styling.

Using {{signature}} in Campaign Emails:
In the campaign editor, insert the {{signature}} variable from the variable picker (or type it manually). When the email is sent, {{signature}} is replaced with the signature stored on the sending mailbox. If a campaign rotates across multiple mailboxes, each recipient automatically gets the correct signature for whichever mailbox sends their email.

Different Signatures per Mailbox:
Since signatures are stored per-mailbox, you can have a different signature for each mailbox without creating separate campaigns. Simply set each mailbox's signature in its Signature tab, then use {{signature}} in your template — the system handles the rest.

Signature Best Practices:

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

Both {{custom.field_name}} and {{field_name}} syntax work, as long as the name does not conflict with a built-in field.

Step 4: Add Fallback Values
Protect against missing data with a fallback — the value shown when a custom field is blank for a prospect. You can write it two equivalent ways; pick whichever reads better:
• Long form: {{custom.subject_line | default: 'Quick question for you'}}
• Short form (double pipe): {{custom.subject_line || 'Quick question for you'}}
Body examples:
• {{custom.first_line | default: 'I came across your company and was impressed by your work.'}}
• {{custom.first_line || 'I came across your company and was impressed by your work.'}}
Both produce the same result — the real value when the field is filled in, the fallback when it's blank — so every prospect gets a coherent email even if a custom field is empty. (Quotes are optional in the short form, and a single pipe like {{firstName | upcase}} is a normal formatting instruction, left untouched.)

Tips and Best Practices:

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.

Why Did My Campaign Finish Without Sending Any Emails?

If your campaign finished showing 0 emails sent, it's almost always because every contact in it was on your suppression list — the list of people your campaigns will never email. When there's no one left to send to, the campaign has nothing to do, so it wraps up right away as finished with nothing sent. This is expected behavior, not a bug.

What the suppression list is: a safety net that holds every address your campaigns should NOT email, so you never message someone who has opted out or can't receive mail. An address lands on it in three ways — they unsubscribed (anyone who clicks your unsubscribe link is added automatically, including you if you click your own link to test it), their address bounced (the mailbox doesn't exist or is closed, so it's set aside), or you marked them do-not-contact (addresses or domains you add to your blocklist yourself). Skipping these contacts is what keeps your sender reputation healthy and keeps you compliant.

Why this happens most often: you send yourself a test, click your own unsubscribe link to confirm it works (which suppresses your address), then build a new test campaign using only your own address — which is now suppressed, so the campaign finishes with 0 sent.

How to check: look for the 'some contacts were skipped' note on the campaign (if the skipped count matches your whole list, that's your answer), and open the campaign's Prospects tab where each suppressed contact shows a 'Suppressed' status.

How to test properly / fix it: use fresh contacts that aren't on your list (a second address you've never unsubscribed works well), OR if you suppressed an address by mistake, remove it under Settings → Blocklist so it's eligible again. Only remove addresses added by accident — leave genuine unsubscribes on the list, because continuing to email people who opted out harms your reputation and isn't compliant.

Reassurance: real campaigns built from fresh contacts send normally; only already-opted-out contacts are skipped. For the full guide with examples and FAQs, see 'Why did my campaign finish without sending any emails?' at /documentation/why-did-my-campaign-finish-without-sending.

Safe Cold-Email Volume After Warmup

How much cold email to send per day per mailbox once it's fully warmed — roughly 30–50 on Gmail, 20–40 on Outlook/Microsoft, 20–40 on Yahoo, as ranges not guarantees — and why you scale by adding mailboxes, not by pushing one harder. Keep warmup running alongside cold sending (about 20–30% of your cold volume, with a floor of ~10–15/day). Typical time to fully warmed is about 4–6 weeks. Warmup mail is clearly tagged and auto-tidied within a day, and warmup health is tracked separately from your cold results. If a domain's spam rate climbs, its warmup is slowed automatically to protect it.

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

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

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 40+ countries), never a shared one.
• Multi-account rotation — Run a campaign across several connected accounts with round-robin, weighted, or random distribution — and each lead stays 'sticky' to the same account for a consistent experience. A banned account can't be recovered, so account safety always comes before speed.

ANALYTICS — see what's working
• Cross-account analytics — Track your funnel (invites sent, accepted, replied) and per-account health across all connected accounts in one view, e.g. spot which account has the best acceptance rate. Export to CSV for your own reporting.

Getting started: make sure you're on a paid plan, add a LinkedIn seat from Billing, connect your account under LinkedIn > Accounts, build an audience with Find LinkedIn Prospects, then create your campaign under LinkedIn > Campaigns. See the other LinkedIn guides in this section for step-by-step details on each capability above.

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 — credentials, cookie-based, or OAuth
  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/linkedin-disconnect-and-reconnect (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-account-safety-limits.

Reconnecting your LinkedIn account after a platform update

From time to time we ship platform-level updates that improve sync speed, delivery reliability, and account-state guarantees. After certain rollouts, LinkedIn accounts connected to WarmySender need a quick re-authentication so the new platform components can pick up the session. If you see an amber 'Reconnect needed' banner at the top of LinkedIn → Accounts, this guide is for you.

Why reconnects sometimes happen after a platform update
WarmySender connects to LinkedIn through our LinkedIn provider, an authentication and orchestration partner. When we upgrade core components — for example, our queue runtime, our LinkedIn worker pool, or the way we register accounts on our LinkedIn provider's side — accounts that were connected on the old infrastructure can become 'orphaned' relative to the new layer. Their actual LinkedIn session is fine; what's stale is the link between WarmySender and our LinkedIn provider for that specific account. The fastest, safest fix is for you to re-trigger the auth handshake so a fresh, clean record is created on the new infrastructure. This is intentional — silently rebinding accounts in the background is exactly the pattern LinkedIn flags as suspicious. A brief, user-initiated reconnect keeps your account in great standing. We will only ever send you a reconnect email when the change is rolling out platform-wide; ad-hoc disconnects (LinkedIn-side session expiry, password change, 2FA reset) are covered in our separate 'Why does my LinkedIn account show as disconnected?' guide.

Who needs to reconnect
Anyone whose LinkedIn account on the LinkedIn → Accounts page shows the amber 'Reconnect needed' alert. If the page is fully green for every account, no action is needed on your end. If even one account is amber, click Reconnect on that row to clear it. Multi-account workspaces should reconnect each affected account individually — it takes about 30 seconds per account.

How to reconnect (4 steps, ~30 seconds)
1) Open WarmySender and go to LinkedIn → Accounts in the sidebar. Affected accounts show an amber 'Reconnect needed' alert with a primary 'Reconnect Account' button. (Screenshot: an amber banner at the top of the page reading 'Reconnect needed — N LinkedIn account(s) require re-authentication' followed by per-row alerts on each affected account.)
2) Click 'Reconnect Account' on the row. You'll be routed to a hosted re-authentication page. No credentials are shared with WarmySender directly — our LinkedIn provider handles the auth securely via LinkedIn's official OAuth-style handshake.
3) Confirm your LinkedIn login. If 2FA is enabled, enter the code. If LinkedIn shows a security challenge or CAPTCHA, complete it as you would any other LinkedIn login. The whole thing should take ~15-20 seconds.
4) Return to WarmySender. The status pill flips from amber 'disconnected' to green 'connected' within seconds. The aggregate banner at the top of the page disappears once every affected account is reconnected. (Screenshot: green 'Connected' status pill alongside the account row, and the amber top-of-page banner gone.)

What happens to my campaigns during reconnection
The moment a LinkedIn account becomes disconnected, every campaign attached to it is auto-paused with reason 'account_disconnected' or 'linkedin_account_disconnected'. Each affected campaign shows a small hint on the campaign card and detail page: 'Will auto-resume after LinkedIn account reconnection.' Prospects keep their exact place in the sequence — nothing is dropped, nothing is reset, no step is skipped. As soon as you complete the reconnect, the platform's failure-rate window resets for that account and the next scheduler tick (within ~5 minutes) automatically resumes the paused campaigns. You do not need to manually click Resume on each one. Account safety always wins: even on resume, sends respect your daily / weekly LinkedIn caps, your sending window, and your active days — there is no burst catch-up of held-back invites.

If a campaign was paused for any OTHER reason at the same time (manual pause, high failure rate from before the disconnect, or a different downstream issue), it may still need a manual Resume from its settings page after reconnection. If you click Resume and it immediately re-pauses, contact support — that signals a stale failure window that needs manual reset.

FAQ
Q: Will I lose my prospects or audiences?
A: No. Reconnecting only refreshes the link between WarmySender and your LinkedIn session. Your prospects, audiences, conversations, campaign sequences, and historical metrics are all stored on our side and are untouched by the reconnect.

Q: Will my campaigns restart from the beginning?
A: No. Campaigns resume from the exact step each prospect was on at the time of the disconnect, including any 'wait for acceptance' or 'wait N days' delays that were in flight. There is no reset and no re-enrollment.

Q: What if reconnect fails or the status doesn't update?
A: Wait 30-60 seconds for our LinkedIn provider's webhook to land, then click 'Sync Status' from the account's three-dot menu. If the status still shows disconnected after a manual sync, the auth flow may not have completed — close any in-progress reconnect tab and try the reconnect button again from a fresh browser tab. If it still fails after a second attempt, email [email protected] with your account email and we'll look at the specific row.

Q: How often do I need to reconnect?
A: Rarely. Platform-update reconnects are infrequent — usually only after meaningful infrastructure rollouts. Ad-hoc reconnects are also rare and are typically driven by LinkedIn (password change, 2FA reset, idle session, IP region change). Accounts in good standing on Premium / Sales Navigator can go months without ever needing a reconnect.

Q: Is my LinkedIn account safe? Will this trigger a flag?
A: Yes, your account is safe. The reconnect uses LinkedIn's official authentication flow via our LinkedIn provider — the same secure handshake any approved tool uses. We never store your LinkedIn password, never bypass 2FA, and never reuse stale tokens. Reconnect after a platform update is a routine, low-stakes action that LinkedIn treats exactly like any other login from your normal IP/device.

LinkedIn seat billing: how add and remove work

WarmySender's LinkedIn add-on is billed at $15 per seat per month (or $120 per seat per year — 33% off — if your subscription is yearly). Each seat allows one connected LinkedIn account.

Pricing & grandfathering: seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price. New orders and newly added seats are billed at $15/seat/month and $120/seat/year (33% off). If you're an existing customer on an older rate and add a seat, your older seats stay at their original rate and the new seat is billed at the current $15 — this means a single invoice can show a mix of rates, which is intended.

This guide explains exactly what happens when you add a seat, what happens when you remove a seat, and why the model is designed the way it is. The key idea: seats follow the same rule as the parent subscription — you pay for the period, you keep what you paid for, and reductions take effect at the next billing date.

Adding seats — your card is charged immediately

When you click 'Add Seat' on the Billing page, the new seat is available right away (you can connect a LinkedIn account to it within seconds), and your card on file is charged immediately for the prorated cost of that seat through the end of the current billing period. The charge is calculated by Stripe and reflects only the days remaining in your current cycle.

Worked example — adding seats mid-period

Let's say your billing cycle runs from April 1 through May 1 ($15/seat/month, monthly billing). On April 15 you click 'Add Seat' to bring your seat count from 2 to 5 (adding 3 seats). The math:

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 retrieve the resulting Stripe invoice and check the payment status — if it requires authentication (3D Secure), we show you a button to complete authentication. If declined, we show a clear message and don't update your seat count. No partial state.

Q: Can I see all my LinkedIn add-on purchases separately?
A: Yes. The billing page lists each add-on purchase as its own card with the date you added it, the seat count, and the price tier. You can cancel or reduce each one independently.

Q: I subscribe annually. How does this work for me?
A: The same logic applies, just stretched over the year. Adding a seat charges immediately for the prorated cost through your annual renewal date. Removing a seat schedules the reduction for the annual renewal date — no refund for the remainder of the year.

Q: Will my running campaigns be interrupted when a scheduled reduction applies?
A: Only if you have more connected accounts than the post-reduction seat count at apply time, in which case the reduction is REFUSED and stays scheduled for the next cycle (the platform never auto-disconnects an account in a billing path). Otherwise, campaigns on the still-existing seats continue normally; the seat count just decreases on your invoice.

Q: How can I see the audit history of my seat changes?
A: Email [email protected] with your account email. We can pull the full timeline of seat additions, scheduled reductions, applied reductions, and cancellations from the audit log.

Why does my LinkedIn account show as disconnected?

Your LinkedIn account can show as disconnected for several reasons — most of them are LinkedIn requiring re-authentication for security, not a bug on our side. WarmySender pauses your campaigns automatically the moment we detect a disconnect, because sending while the account is in a half-authenticated state is exactly how LinkedIn detects automation and restricts accounts.

The LinkedIn account status lifecycle
WarmySender connects to LinkedIn through a specialist integration partner, which reports each connected account in one of these states:

When we detect any state other than Connected, your LinkedIn campaigns associated with that account are automatically paused.

Why LinkedIn forces re-authentication (not your fault)
Common triggers, all initiated by LinkedIn for security:

None of these are caused by WarmySender. The frequency depends on your LinkedIn account's history and how often you log in elsewhere. Some accounts go months without a disconnect; others need re-authentication every few weeks.

What WarmySender does automatically when an account disconnects

1. We detect the disconnect within minutes (our integration partner notifies us, and a periodic health check catches anything the notification missed).
2. We immediately pause every campaign attached to that account, with the pause hint 'LinkedIn account disconnected'.
3. No further sends are attempted on that account until you reconnect.
4. Existing prospects in mid-sequence keep their place — nothing is lost. They wait at their current step.
5. If the disconnect persists for more than 24 hours, we email you a 'Your LinkedIn account [Name] disconnected — paused N campaigns' message with a one-click reconnect link.

How to reconnect

1. Go to Settings → LinkedIn Accounts (or LinkedIn → Accounts in the sidebar).
2. Find the disconnected account — it will show a red status pill and a 'Reconnect' button.
3. Click 'Reconnect'. You'll be redirected to a hosted authentication page (no password is shared with WarmySender).
4. Complete LinkedIn's verification: enter your password, 2FA code if requested, and resolve any CAPTCHA or in-app validation challenge.
5. Return to WarmySender. The account status flips back to 'connected' within seconds.

Do I need to manually unpause my campaigns?
In most cases, no — campaigns paused because the LinkedIn account disconnected resume automatically on the next scheduler tick after reconnection. The platform also resets the failure-rate window on every campaign attached to the just-reconnected account, so a backlog of dead-account-era errors won't immediately re-pause the campaign on resume.

However, if a campaign was paused for any OTHER reason at the same time (e.g. high failure rate from before the disconnect, manual pause, or a different downstream issue), it may still need manual resume from the campaign's settings. If you click Resume and the campaign immediately re-pauses, contact support — that signals a stale failure window that needs manual reset.

If your LinkedIn add-on seat was canceled
If the disconnect happened because your LinkedIn add-on seat was canceled (not because LinkedIn force-logged you out), the reconnect flow routes you to Billing instead. Add a seat back, and the existing campaigns and audiences stay intact.

Why frequent disconnects can happen on free LinkedIn accounts
Free LinkedIn accounts have stricter session policies than Premium / Sales Navigator. If you experience repeated disconnects on a free account, the long-term fix is upgrading to a paid LinkedIn tier — they get longer session windows, fewer security challenges, and higher per-account daily caps.

FAQ:

Q: My account shows 'connected' but campaigns are paused. Why?
A: The disconnect probably resolved automatically (LinkedIn re-validated the session in the background) but the campaigns kept their previous pause reason from the disconnect window. The auto-resume sweeper runs every 5 minutes, so give it one tick first. If a campaign is still paused after that, open it and read the pause hint. If the hint points at billing — an unpaid invoice or an inactive subscription — settling the invoice is the only thing that clears it, and everything resumes on its own within about a minute afterwards; there is no button to press. For any other reason, press Resume on the campaign. If it re-pauses immediately, contact support.

Q: Will my prospects be lost during a disconnect?
A: No. Every prospect's position in the sequence is preserved. When the campaign resumes, prospects continue from exactly the step they were on, including any 'wait for acceptance' or 'wait N days' delays that were in flight.

Q: How long do I have to reconnect?
A: Indefinitely — there's no deadline. But the longer you wait, the more pent-up backlog builds in your campaigns. After reconnecting, the platform respects per-account daily caps, so a long disconnect won't be 'caught up' in a burst.

Q: Can I prevent disconnects?
A: Mostly no — they're triggered by LinkedIn's security, not by us. Things that help: don't log into LinkedIn from new devices/IPs while your WarmySender account is active, don't change your LinkedIn password during a campaign, and consider upgrading from a free LinkedIn account to Premium if you're hit with frequent disconnects.

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/linkedin-disconnect-and-reconnect; 'LinkedIn Campaign Documentation' (how active days, sending windows, and the ramp interact, and why acceptance can lag 1-3 days) at /documentation/linkedin; 'Why does my LinkedIn account show as disconnected?' (the full account status lifecycle: Connected, Reconnect needed, Verification required) at /documentation/linkedin-account-disconnected.

Why did my LinkedIn account disconnect — and how to reconnect

If your LinkedIn account suddenly shows a 'Reconnect' badge in WarmySender — and your campaigns paused on their own — this is almost always a routine LinkedIn session refresh, not a bug. This guide explains the cause in plain language, exactly what you'll see, how to fix it in under a minute, and what happens to your data.

The short version

LinkedIn rotates the session tokens that authenticate your account every ~30 days, and immediately on suspicious-login signals (new device or IP, password change, 2FA reset, security challenge). Our integration partner cannot silently refresh those tokens for security reasons — LinkedIn would flag a silent rebind as automation. The safest fix is for you to re-trigger the login flow once. Click the Reconnect button on the account, sign into LinkedIn, and you're done. Campaigns auto-resume within 5 minutes.

Why LinkedIn forces a re-login (the real reason)

LinkedIn issues every authenticated session a short-lived token. That token is what proves to LinkedIn that an action (sending an invite, fetching a profile, posting a comment) is coming from you, not a bot. LinkedIn rotates these tokens for security — exactly the same way your bank logs you out periodically. When the token expires or is invalidated, our integration partner reports that LinkedIn's credential check no longer passes and a fresh login is required. Common triggers for this status:

None of these are caused by WarmySender. Premium and Sales Navigator accounts get longer windows than free LinkedIn accounts, but every account eventually rotates.

What you'll see in WarmySender

When we detect the disconnect (within ~5 minutes via our LinkedIn provider webhook + periodic health check), the platform takes three actions immediately:

1. The LinkedIn account row on LinkedIn → Accounts shows an amber or red 'Reconnect' badge next to the account name. The status pill switches from green 'Connected' to 'Reconnect needed'.
2. Every campaign attached to that account is auto-paused because its LinkedIn account is disconnected. The campaign card shows a small hint: 'Will auto-resume after LinkedIn account reconnection.'
3. If the disconnect persists for more than 24 hours, we email you a one-click reconnect link from [email protected] with the subject 'Your LinkedIn account [Name] needs to be reconnected'. Clicking that email link drops you directly on the reconnect screen — no login to WarmySender required first.

How to reconnect (4 steps, ~30 seconds)

1. Open WarmySender and click LinkedIn → Accounts in the sidebar (or click the link in the reconnect email).
2. Find the affected account — it shows the amber 'Reconnect' badge. Click the 'Reconnect Account' button on that row.
3. You'll be routed to a hosted re-authentication page. Enter your LinkedIn email and password. If 2FA is enabled, enter the code. If LinkedIn shows a security challenge or CAPTCHA, complete it as you would any normal LinkedIn login. WarmySender never sees your password — our LinkedIn provider handles the secure handshake with LinkedIn directly.
4. Return to WarmySender. The status pill flips back to green 'Connected' within seconds.

What happens after you reconnect

The self-heal sweeper runs every 5 minutes and automatically resumes any campaign that was paused because its LinkedIn account disconnected, once that account is back to Connected. You do not need to manually click Resume on each campaign. The platform also clears the failure-rate window so dead-account-era errors don't immediately re-pause anything. Account safety still wins on resume — sends respect your daily and weekly LinkedIn caps, sending window, ramp schedule, and active days. There is no burst catch-up of held-back invites, ever.

A campaign paused for any OTHER reason at the same time (manual pause, stuck-loop pause, subscription issue) may still need a manual Resume from its settings page. If you click Resume and it immediately re-pauses, contact support — that signals a stale failure window or a separate issue.

When to ask support

Email [email protected] with the LinkedIn account email and approximate reconnect time. We'll dig into the specific row.

FAQ

Q: Will I lose my pending invites?
A: No. Pending invites stay on LinkedIn — they are independent of WarmySender's connection state. Any invite already delivered to a prospect will still appear in their LinkedIn invitation queue, and any acceptance will still flow back to your dashboard via the 6h polling fallback even if the webhook missed it during the disconnect.

Q: Will recipients see I went offline, or that something changed?
A: No. The disconnect is purely between WarmySender's integration layer and LinkedIn's auth system. From the recipient's point of view, nothing changed — you appear online or offline on LinkedIn exactly as you would normally. They never see a 'this user disconnected from a tool' signal because no such signal exists.

Q: Will I lose my campaign data, prospects, or audiences?
A: No. Reconnecting only refreshes the auth token between WarmySender and LinkedIn. Your prospects, audiences, conversations, campaign sequences, sent metrics, and historical analytics are stored on our side and are completely untouched by the reconnect. When campaigns resume, every prospect picks up at the exact step they were on, including any 'wait for acceptance' or 'wait N days' delays in flight.

Q: How long do I have to reconnect?
A: Indefinitely — there's no hard deadline. But the longer you wait, the more pent-up backlog builds in your campaigns. After reconnecting, the platform respects per-account daily and weekly caps, so a long disconnect won't be 'caught up' in a burst — throughput rolls back to normal over the next 1-2 weeks.

Q: Why does this happen even though my account is in good standing?
A: LinkedIn's session rotation is unrelated to account standing. Even healthy, paid Sales Navigator accounts that have never been restricted hit the ~30-day rotation. Premium and Sales Navigator typically rotate less frequently than free accounts, but no account is exempt.

Q: Is reconnecting safe? Will it trigger a flag on my LinkedIn account?
A: Yes, it's safe. Reconnect uses LinkedIn's official authentication flow — the same secure handshake you use when you log into LinkedIn from a browser. No password is stored on our side, no 2FA is bypassed, and no stale tokens are reused. LinkedIn treats reconnect exactly like any other login from your normal IP and device.

Q: Can I just leave the account disconnected and reconnect later when I have time?
A: Yes. Leaving an account disconnected is harmless — campaigns just stay paused at their current step. There's no penalty, no data loss, and no LinkedIn-side flag for taking your time. Reconnect when you're ready and everything resumes.

Q: I just reconnected but my campaigns are still paused. What now?
A: The auto-resume sweeper runs every 5 minutes — give it one tick. If campaigns are still paused 10 minutes after reconnect, check that the LinkedIn account on LinkedIn → Accounts shows green 'Connected' (sometimes the LinkedIn-side handshake takes a few extra seconds to complete). If the account is green but campaigns are still paused after 15 minutes, they have an additional pause reason — open the campaign and read the pause hint. If the hint points at billing (an unpaid invoice, an expired trial, or an inactive subscription), settling the invoice is the only thing that clears it: everything resumes on its own within about a minute afterwards, and there is no button to press. If the hint points at a manual pause or a stuck step, press Resume on the campaign. If Resume immediately re-pauses, email support.

For platform-wide reconnects after a major infrastructure rollout, see the separate 'Reconnecting your LinkedIn account after a platform update' guide.

Related guides: 'Why does my LinkedIn account show as disconnected?' (the full account status lifecycle), 'LinkedIn campaign auto-pause and resume' (campaign-side behavior), 'LinkedIn account safety and ramp' (why we never burst after a gap).

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) Circuit breaker triggered — if too many errors occur (10+ in a day), enrichment stops to protect your account. Reconnect your account and retry.

Q: Can I speed up enrichment?
A: The enrichment rate is intentionally conservative to protect your LinkedIn account. Faster enrichment would risk LinkedIn restrictions or bans. As your account moves to higher ramp weeks (2-6 weeks after connection), the daily cap automatically increases. Veteran accounts (1+ year old) have the highest caps.

Q: Does enrichment count toward my LinkedIn daily limits?
A: Yes, enrichment uses profile view API calls that share the daily limit with campaign 'View Profile' steps. If you have active campaigns with profile view steps, they share the same daily cap.

Tip: Build targeted audiences using Sales Navigator filters for best results. Quality over quantity — a smaller, well-targeted audience will outperform a large, generic one.

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):
40+ countries are available. Countries with guaranteed availability include:
• Americas: United States, Canada, Brazil
• Europe: United Kingdom, Germany, France, Switzerland, Austria, Netherlands, Belgium, Italy, Spain, Portugal, Sweden, Norway, Denmark, Ireland
• Asia-Pacific: Singapore, Japan, India, Australia
• Middle East: United Arab Emirates

Additional countries may be available depending on current inventory. The full list is shown during account setup.

Custom Proxy Setup:
If you select Custom mode, enter your proxy URL in this format:
protocol://username:password@host:port

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)

WarmySender's 4 pillars — cold emailing, email warmup, LinkedIn outreach, and multichannel — all respect a campaign's sending window. This guide explains how the LinkedIn sending window works, why a small subset of LinkedIn campaigns occasionally queued sends outside the chosen hours before April 27, 2026, and how that issue is now resolved.

What the sending window is:
Every campaign has four schedule controls:
• Start hour — the earliest time of day (in your campaign's timezone) when sends are allowed (e.g., 9 AM)
• End hour — the latest time of day when sends are allowed (e.g., 5 PM)
• Schedule days — which days of the week sending is allowed (e.g., Mon/Tue/Wed/Thu/Fri)
• Timezone — the IANA timezone (e.g., Asia/Kolkata, Europe/London, America/New_York) used to interpret the start/end hours

For example, a campaign set to 'Mon-Fri 9 AM to 5 PM Asia/Kolkata' will only send between 9 and 5 IST on weekdays. Outside those hours, the scheduler holds the job and clamps it forward to the next valid moment within the window.

Why sending only inside the window matters:
LinkedIn's automation-detection systems weigh many signals. One of them is the time-of-day pattern of your account's activity. The published guidance from our LinkedIn integration partner is that invitations and messages should be distributed across working days at random intervals — and 'working days' is understood to mean normal business hours. A connection request that fires at 4 AM looks unmistakably automated, even if the daily/weekly cap is respected. Sending strictly inside the user-configured window is therefore not just a UX preference — it is part of staying invisible to LinkedIn's automation detection.

The issue we found and fixed on April 27, 2026:
WarmySender's scheduler runs both email and LinkedIn jobs through a single unified engine. The email branch of that engine has always re-aligned any send whose computed time falls outside your window. The LinkedIn branch was supposed to call the same function. Due to a copy-paste omission when the unified engine was first built, the LinkedIn branch only enforced the day-of-week (e.g., 'don't send on Saturday') but skipped the hour-clamp ('don't send before 9 AM or after 5 PM').

The practical impact:
In the seven days leading up to the fix, roughly 134 LinkedIn jobs across the entire platform (about 0.6% of total LinkedIn jobs) queued at hours outside their campaign's chosen window. Most of these were a few hours off — a 5 PM cutoff that became a 6 PM send, or a 9 AM start that was nudged back to 8 AM by random jitter. The legacy LinkedIn-only scheduler enforced the window correctly, so older campaigns were unaffected. Campaigns sending within strict, narrow windows (e.g., London 10 AM-4 PM) were affected the most.

The fix:
The LinkedIn branch of the scheduler now applies that same re-alignment immediately before every send is queued, identical to the email branch. We added a regression test that asserts every queued LinkedIn job's run-time falls within the campaign's window. No backfill is needed — historical sends already happened — but every send going forward will be inside your chosen hours.

How to verify your campaign respects your window:

  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.

How LinkedIn account safety limits work — invites, messages, InMails, and the gradual ramp

WarmySender automates the full outreach stack — cold emailing, email warmup, LinkedIn outreach, and multichannel sequences. On the LinkedIn side, account safety always wins over speed. A banned LinkedIn account is unrecoverable, so every cap below is set conservatively and is enforced by the scheduler regardless of how aggressively a campaign is configured. This guide explains the four cap dimensions, how they are computed, the four account types, the four ramp strategies, and the new dedicated InMail cap shipped on April 27, 2026.

The four cap dimensions WarmySender enforces per LinkedIn account:

  1. Invites per week — How many connection requests the account can send in a rolling LinkedIn week. LinkedIn's own caps are 100-200 per week depending on tier. WarmySender stays at or below this ceiling.
  1. Messages per day — How many direct messages to existing 1st-degree connections the account can send per day.
  1. InMails per day (NEW April 27, 2026) — How many InMail messages to people who are NOT 1st-degree connections the account can send per day. Before April 27 this shared the messages-per-day bucket, which allowed up to 100 InMails per day on a Sales Navigator account — well above our LinkedIn provider's recommended safe band of 30-50 per day. Now there is a dedicated cap, so InMails and regular messages are tracked and limited independently.
  1. Profile views per day and engagements per day — How many profile views and how many post likes/comments/endorsements the account can make per day. These have always been capped per ramp week; no change in April 2026.

How the daily/weekly cap is computed:
For each cap dimension, the effective limit is the MINIMUM of two values:
• Account-type cap — A ceiling determined by your LinkedIn subscription tier (Free / Premium / Sales Navigator / Recruiter)
• Strategy cap — A ramp-week-aware value determined by your account's ramp strategy (new_account / established / veteran / recovery)

The stricter of the two always wins. So a brand-new Recruiter account is held to the new_account ramp limits, not the Recruiter tier ceiling, until it has aged enough to graduate to a faster strategy.

The four ramp strategies (and what they mean):

The four account types (and their ceilings):

The new InMail ramp curve in plain English (April 27, 2026):

If you connect a brand-new Sales Navigator account, you will start at 25 InMails per day in week 1. By week 2 you reach 40 InMails per day, which is the full capacity for a Sales Navigator veteran account. Premium accounts cap at 15 InMails per day even at full ramp. Free accounts cannot send InMails at all because LinkedIn restricts that feature to paid tiers.

The full ramp table (per strategy) for InMails per day:

These values are then capped by the account-type ceiling above. So a brand-new Sales Navigator account is held at 25/day in week 3 (strategy cap), even though Sales Navigator's account-type ceiling is 50/day. A veteran Premium account is held at 15/day (account-type cap), even though the veteran strategy would allow 40/day.

Why we ramp gradually (the most important paragraph):

WarmySender connects to LinkedIn through a specialist integration partner. Their published safe daily band for InMails is 30-50 per day across all paid tiers. Going faster than that — even on a Recruiter account that LinkedIn technically allows up to 100/day — significantly increases the chance that LinkedIn flags your account for unusual activity and applies a temporary restriction. A restriction can range from a 'verify your identity' challenge (24-48 hour resolution) to a permanent account loss. WarmySender's default of 40/day for a Sales Navigator veteran sits comfortably in the middle of our LinkedIn provider's safe band, and the 2-week ramp from 25 to 40 mirrors the natural growth pattern of a real human user.

How to override (custom override field in account settings):

If you have legitimate operational need to push higher than the default — for example, a Recruiter account with a documented LinkedIn-Recruiter contract allowing 100/day — you can set a custom override per account. The fields are:

These fields are validated on our side: the override cannot exceed the published safe ceiling (e.g., InMails cannot be set above 50/day even with an override, regardless of LinkedIn's stated upper bound). The override must be set explicitly per account from the LinkedIn Account settings page, and changing it requires acknowledging the risk warning. We deliberately do NOT expose a 'turn off all safety limits' option, because that would put your account in the high-risk band without recourse.

How to check your current limits:

  1. Go to LinkedIn > Accounts in the sidebar.
  2. Click into a specific account.
  3. The account detail panel shows: account type pill (Free / Premium / Sales Navigator / Recruiter), current strategy (new_account / established / veteran / recovery), current ramp week (e.g., 'Week 3 of 6'), and the four effective daily/weekly caps for invites, messages, InMails, profile views, and engagements.
  4. Below that, you can see today's running counts toward each cap (e.g., 'Invites this week: 47/200 — 30% of cap'). When a cap is reached, the next scheduler tick stops queuing that action type until the cap window resets.

What happens when a cap is reached:

The scheduler does not 'overflow' or 'burst' to catch up. Each campaign sharing the account simply waits until the cap resets — daily caps reset at 00:00 UTC, weekly caps roll on Monday 00:00 UTC. Prospects in flight do not lose their place in the sequence. They wait at their current step until the next legal sending opportunity. This is consistent with the 'never bulk-replay missed sends after an outage' principle: bursting is the single most reliable way to trigger LinkedIn restrictions, so we always pace at the configured rate, not a catch-up rate.

What happens if user config conflicts with safety limits:

If a campaign is set to 'send 100 invites per day' but the per-account cap is 40, the campaign will execute 40 invites per day until the prospect pool is exhausted or the account graduates to a higher cap. The campaign does NOT fail, and prospects do NOT silently disappear — they wait. This is the 'account safety always wins' rule from CLAUDE.md: when user intent conflicts with safety, safety wins and the step waits or defers.

Summary table of full-ramp caps (after the strategy ramp completes):

| Account type | Invites/week | Messages/day | InMails/day | Profile views/day | Engagements/day |
|---|---|---|---|---|---|
| Free | 150 | 100 | 0 | 30 | 30 |
| Premium | 200 | 150 | 15 | 50 | 40 |
| Sales Navigator | 200 | 150 | 50 | 60 | 50 |
| Recruiter | 200 | 150 | 100 | 60 | 50 |

The strategy cap is then applied on top — for example, a Sales Navigator veteran account hits 40 InMails/day even though the account-type ceiling is 50/day, because the veteran strategy caps at 40 (the center of the published safe band).

For the related sending-window enforcement fix shipped the same day, see the 'Why my LinkedIn campaign sometimes sends outside my chosen hours' guide above.

How InMail delivery is verified

When WarmySender sends a LinkedIn InMail on your behalf, every successful send is verified against our LinkedIn provider's response before any counter or dashboard tile is incremented. This guide explains how that verification works and what you should expect to see on the dashboard.

How it works

LinkedIn InMail is an off-network message that goes through the recipient's LinkedIn inbox even if you're not connected. WarmySender drives LinkedIn actions through a specialist integration partner, and creating an InMail goes through them. On a real send, LinkedIn hands back a conversation ID — the unique identifier of the InMail thread on LinkedIn's side. WarmySender treats the presence of that conversation ID as proof of delivery: no conversation ID means the InMail did not actually queue on LinkedIn, even if the send request itself came back looking successful.

This matters because LinkedIn rejects InMail sends for several legitimate reasons: the recipient might not be eligible (no Open Profile, no Sales Navigator credits, account paused), the daily / weekly cap might be reached, the network might have hiccupped, or the underlying LinkedIn session might need a refresh. In any of these cases, the send request can come back looking successful while the InMail itself was silently dropped. WarmySender's contract with you is that the dashboard counter and the per-account InMails-Sent-Today tile only advance when the conversation ID proves the message landed.

What you'll see on the dashboard

- InMails Sent — Counts only verified sends. If you see this counter at zero while your campaign is active, it means we attempted the send but LinkedIn never confirmed a conversation. Check the Account → Health tile for cap exhaustion or eligibility issues, and check the campaign's most-recent skipped events for the specific reason.
- InMail Replies — Counts only inbound messages on a verified thread. Reply rate is computed against verified sends, not attempted sends — your reply % is honest.

What to do if your InMail count looks lower than expected

1. Check the campaign's per-prospect skipped events. If many say the InMail was never confirmed, the underlying account or eligibility check is failing — review your LinkedIn account's Sales Navigator subscription status, InMail credits remaining, and the recipient's Open Profile flag (if applicable).
2. Check your account's daily InMail cap on the LinkedIn Accounts page. WarmySender ramps InMail caps over the first 4 weeks in line with our integration partner's account-safety guidance.
3. If counts look right but your delivery rate is unusual, contact support — we'll pull the delivery trail for your account and confirm what LinkedIn returned on each attempt.

Why we don't count phantom sends

A platform that counts every attempted send, confirmed or not, as a successful send produces an inflated dashboard, an incorrect cost-per-reply ratio, and a false sense of throughput. Worse, when a customer pays for Sales Navigator credits, they're entitled to know which credits were actually consumed and which were silently dropped. We treat InMail sends like financial transactions: no confirmed conversation, no count.

What happens if a campaign pauses unexpectedly

If you log in and find a campaign in a paused state you didn't trigger yourself, here's how WarmySender's auto-pause works, why it does what it does, and what to expect during recovery.

When WarmySender auto-pauses a campaign

Auto-pause is a safety mechanism, not a fault state. The platform pauses a campaign when continuing to send would put your LinkedIn account at risk or when the campaign cannot make progress. Specifically:

- Your LinkedIn account disconnected (our LinkedIn provider detected that LinkedIn rotated your session token, your password changed, you triggered a 2FA prompt, or your IP region changed). LinkedIn rotates session tokens on a roughly 30-day rhythm; this is normal.
- A high-failure-rate window was detected. If invites or messages keep getting rejected, we pause to investigate before continuing — sustained failure rates are a strong ban-risk signal on LinkedIn.
- The account was restricted by LinkedIn (warning, jail, or partial restriction). Continuing to send during a restriction would likely escalate it.
- The subscription on the workspace lapsed. We hold campaign state but don't send.

What the dashboard shows

Every paused campaign shows a reason chip on the campaign detail page. Hover over it for the full explanation. If you ever see a paused campaign without a reason chip, that's a bug — a safety rule in our database rejects any pause that doesn't carry a reason — so if you encounter one, please email support and we'll investigate.

Reasons you might see (and what each means):
- LinkedIn account disconnected — Your LinkedIn account was disconnected. Click Reconnect on the LinkedIn Accounts page; the campaign will auto-resume within ~5 minutes.
- High failure rate — Too many sends failed in a recent window. We pause to protect the account; once the underlying cause is fixed (e.g., a template typo, a Sales Nav credit refill, an Open Profile mismatch), click Resume.
- Account restricted — LinkedIn restricted the account. DO NOT immediately resume; wait until the LinkedIn restriction lifts and contact support before resuming so we can verify the account is healthy.
- Subscription lapsed — The workspace subscription lapsed. Settling the invoice is the only thing that clears this one; the campaign resumes on its own within about a minute afterwards.
- Paused manually — You (or another workspace member) clicked Pause. Resume when ready.

What happens to your prospects during a pause

Paused campaigns hold all per-prospect state in place. Prospects that were scheduled for tomorrow will still be scheduled for tomorrow when you resume; the scheduler doesn't burst-send a backlog the moment Resume is clicked. Specifically:

- Prospects with a future next-action timestamp that fell during the pause window get moved forward to the next valid sending window using the campaign's active days, sending window, timezone, and time-randomisation settings.
- Prospects already accepted are not re-invited.
- Pending invites are tracked on our LinkedIn provider's side and detected automatically when the recipient accepts.

Multichannel campaigns and email sends

If you have a multichannel campaign (email + LinkedIn) and your LinkedIn account disconnects, the campaign now correctly continues sending email steps for prospects whose current step is an email step. Earlier versions of the platform paused all multichannel campaigns when any linked LinkedIn account disconnected — we now check whether any active step in the campaign actually uses LinkedIn, so if none do, the disconnect won't pause it.

Manual recovery

If a campaign is paused and the underlying issue is resolved, click Resume on the campaign detail page. Resume re-checks every safety gate (account health, daily/weekly cap, ramp schedule, subscription status). If Resume can't proceed, the page tells you the specific reason inline.

Why we don't auto-resume after a manual pause

If you paused a campaign manually, we don't know whether you wanted to pause it for an hour or for a quarter. Manual pause stays paused until you click Resume. The auto-resume sweepers only restart pauses we explicitly know are recoverable — a disconnected LinkedIn account once it reconnects, and a high failure rate once the failure rate normalizes.

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)? Sometimes a reconnect brings the account back without its Sales Navigator access attached, even though your subscription is still active — so the plan can read as Premium and the list comes back empty. The one-click fix: on the import screen (or under LinkedIn > Accounts), use 'Re-check Sales Navigator access' on that account. WarmySender re-checks the connection and restores Sales Navigator access when it finds it, then you can run the import right away. If the re-check still can't find Sales Navigator access, reconnect the account with Sales Navigator open in your browser so the connection picks it up, then re-check once more. Setting the plan by hand only changes the label — the re-check is what actually restores access, so use it whenever an import is refused.

Reliable fallback: a regular LinkedIn people-search link (from LinkedIn's normal search bar) works on any connected account, including Free — no subscription needed. Run your search, copy the link from the address bar, and paste it into WarmySender to build your audience. Sales Navigator adds finer filters and saved lists, but a regular search link never depends on a paid tier.

For the full walkthrough with a worked example and FAQs, see the 'Why won't my Sales Navigator list import?' guide at /documentation/why-my-sales-navigator-list-wont-import.

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.

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 ($20 per seat per month, or $165 per seat per year to save). Each seat lets you connect and run one Instagram account. A seat belongs to the workspace you bought it in; if you need it in a different workspace, you can move it from the Billing page.
  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 on the secure Instagram page (username, password, and your two-factor code if you use one). It takes about a minute and only has to be done once per account. Here's the full walkthrough, plus what to do if the connection ever needs refreshing.

What connecting unlocks: Instagram DM outreach in WarmySender — you can warm prospects up with follows, profile views and likes, then send DM campaigns, all inside safe daily and hourly limits that protect your account, and read and reply to every conversation in one real-time inbox.

Before you start: you'll need an active paid plan and at least one Instagram seat added on the Billing page ($20 per seat per month, or $165 per seat per year). Each seat connects one Instagram account. A seat belongs to the workspace you bought it in; if you need it in a different workspace, you can move it from the Billing page. Personal, Creator, and Business accounts all work.

Connect your account:

  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. You'll then be taken to a secure Instagram sign-in page to log in with your Instagram username and password.
  4. If your account uses two-factor authentication, you'll be asked for your verification code — enter it promptly, as these codes expire quickly.
  5. Once you're signed in, you're brought back to WarmySender and your account appears on the Accounts page, ready to use.

Right after connecting: WarmySender takes a short moment to finish setting up and pulls in your recent conversations so your inbox is ready. New actions ease in gently for the first hour — this is deliberate, so a freshly connected account never starts with a burst of activity.

Why sign in on Instagram's own page? So your password is entered directly with Instagram and handled securely. WarmySender connects to your account the same careful way the official Instagram apps do.

If your account shows 'Disconnected' or 'Needs verification': Instagram occasionally asks you to sign in again — after a password change, a new-device check, or a security prompt. When that happens, open Instagram > Accounts and click 'Reconnect', then sign in again (and enter a fresh code if asked). Any campaigns that were using that account pause themselves while it's disconnected and pick right back up once it's healthy again — nothing is lost, and prospects stay exactly where they were in your sequence.

One account per seat: to run more than one Instagram account at the same time, add another seat on the Billing page, then connect the next account the same way.

Account safety always comes first — connecting, reconnecting, and the gentle first-hour ramp are all designed to keep your account in good standing.

Full guide: /documentation/how-to-connect-your-instagram-account

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

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 $20 per seat per month, or $165 per seat per year — one seat per Instagram account you connect and run. Add, adjust, or cancel seats any time from the Billing page. Each seat unlocks full outreach for one account: sequences, real-time inbox, and analytics, all inside the safe daily and hourly limits that protect the account.

Pricing: $20 per seat per month, or $165 per seat per year (paying yearly saves you money versus monthly). Each seat lets you connect and run one Instagram account with full outreach — sequences, inbox, and analytics.

Which workspace a seat belongs to: a seat lives in the workspace you bought it in, so its account is available in that workspace. If you need the seat in a different workspace, you can move it from the Billing page — you don't have to buy a new one.

What you need first: an active paid WarmySender plan. Instagram is an add-on on top of your plan, available on any paid tier. If you're on the free tier, upgrade first, then add Instagram seats.

Add seats:
1) Go to Billing and find the Instagram add-on card.
2) Choose how many seats you want (one per account you plan to connect) and whether to bill monthly or yearly.
3) Confirm — your seats are ready right away, and you can head to Instagram > Accounts to connect your account(s).
If you're adding seats to a plan you already pay for, the new seats are prorated so you only pay for the remaining part of the current billing period.

Add more later: need another account? Add another seat any time from the same Billing card — connect the new account once the seat is active.

Reduce or cancel seats: you can lower your seat count or cancel the Instagram add-on from the Billing page. Changes to reduce seats take effect at the end of your current billing period, so you keep the seats you've paid for until then — nothing is cut off mid-cycle. Your connected account and its conversation history remain visible; only new outreach stops when a seat is removed.

Monthly vs yearly: monthly gives you flexibility to change month to month; yearly locks in the lower per-seat rate. You can start monthly and switch to yearly later to save.

Where to see live pricing: the Billing page and warmysender.com/pricing always show the current rates and any active offers — the live page is the source of truth if anything ever differs.

One bill, all channels: your Instagram seats appear on the same account billing as your plan and any LinkedIn seats, so everything's in one place.

Full guide: /documentation/instagram-seats-and-billing

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

Prospects & Data

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:

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

Find Your Ideal Leads with Filters

Find your ideal B2B leads fast by stacking filters in the built-in Leads Database. Each filter you add narrows the results, so combining a few turns hundreds of millions of contacts into a focused shortlist of decision-makers — then save the shortlist to a list and launch a campaign from it.

The Filters You Can Use:

Filters are additive — the more you add, the smaller and more precise the list. A live match count updates as you go, so you can find the balance between 'too broad' and 'too few'.

Three Example Searches:

  1. Marketing VPs in Canada with a verified email and a LinkedIn profile — Location: Canada · Department: Marketing · Seniority: VP · Verified email only: on · Has LinkedIn: on. A clean, multichannel-ready list of senior marketing decision-makers in one market.
  2. Founders and CEOs of US companies with a verified email — Location: United States · Seniority: C-level (add the title word 'founder' to widen it) · Verified email only: on. Leave Department off to reach the leader of the whole company.
  3. HR managers in a specific city — Location: country, then state/province, then city · Department: HR (search 'human resources' in Job title to widen it) · Seniority: Manager. Watch the live count — if a city is too narrow, search the whole state/province instead.

What We Don't Filter On (Yet):
WarmySender's targeting is built around people — role, seniority, department, location, and reachability by email and LinkedIn — and those filters are reliable because that information is well covered. We do NOT currently offer dependable company-size (headcount) or revenue filters: that information is available for only a small fraction of records, so filtering on it would hide most of the contacts you'd want to see and return a misleadingly small list. We've left those filters out rather than quietly drop good leads. If company-size or revenue targeting matters to you, email [email protected] so we can prioritize.

After Filtering:

  1. Select contacts (individually or all on the page).
  2. 'Save to List' — add to a new or existing prospect list (you'll see how many were added vs duplicates).
  3. Create a campaign straight from the list, or export it as a CSV. Saved leads land in the same prospect list a CSV import would create, so sequences, sending limits, warmup, and analytics all work identically. Run the list through the email check before your first send to keep it clean.

Full walkthrough with worked examples: warmysender.com/documentation/find-your-ideal-leads-with-filters

Email Verifier

WarmySender includes a built-in Email Verifier to validate email addresses before campaigns — reducing bounces and protecting sender reputation. Included free with all paid subscription plans.

Plan Limits:

How It Works:
The verifier asks the receiving mail server whether an address can accept mail — without ever sending an email to it. Nobody is contacted, nothing arrives in anyone's inbox, and the check never runs through your own connected mailboxes, so your sender reputation is never put at risk to test a list.

What each check establishes:
1. Whether the address is written in a usable form
2. Whether the company can receive mail at all
3. Whether that specific mailbox exists and accepts mail
4. Whether the company accepts every address (a catch-all — see below), which means no tool can confirm one specific inbox there
5. Whether we already have first-hand proof: if your own mail has reached that inbox before, that real delivery is stronger evidence than any live check, and we use it instead. Results confirmed this way are marked 'Real delivery' in your results.

Most addresses come back in a second or two. Larger lists are paced deliberately rather than checked all at once — that pacing is part of what keeps the answers accurate.

Important: verification tells you an address is good AT THE MOMENT IT WAS CHECKED. It is not a permanent guarantee — people leave companies and mailboxes get closed. See 'Why a verified list can still bounce' below.

Accessing the Email Verifier:
Navigate to Email > Email Verifier in the sidebar (look for the green 'New' badge). You'll see three tabs:

--- Tab 1: Batch Verification (CSV Upload) ---
Verify a list of email addresses from a CSV file.

How to use:
1. Click 'Upload CSV' and select your file
2. The system automatically detects the email column (supported headers: email, email_address, e-mail, contact_email, emailaddress)
3. If no header matches, the system checks each column for email-formatted values
4. Emails are deduplicated, validated, and sanitized before processing
5. Verification processes gradually in the background (not all at once) to ensure accuracy and avoid rate limits
6. Monitor progress with the real-time progress bar — the page auto-refreshes every 3 seconds
7. View results filtered by status (All, Valid, Invalid, Risky, Unknown)
8. Download the complete results as a CSV when finished

CSV Requirements:

--- Tab 2: Verify a List ---
Verify emails directly from your existing prospect lists — no CSV export/import needed.

How to use:
1. Select a prospect list from the dropdown
2. Click 'Verify List'
3. The system extracts all email addresses from the list's prospects (skips prospects without emails and LinkedIn-only placeholders)
4. Verification runs in the background with real-time progress
5. When complete, two things happen automatically:
a) A NEW list called '[Your List Name] - Verified' is created containing only prospects with valid or risky emails
b) Prospects with invalid emails are automatically marked 'invalid' across your contact database, so every campaign skips them from then on
6. The verified list appears in your Prospects page ready to use in campaigns

This is the recommended workflow before launching any campaign:
1. Import your prospects into a list
2. Go to Email Verifier > Verify a List
3. Select the list and verify
4. Use the auto-created '[Name] - Verified' list in your campaign

--- Tab 3: Single Check ---
Verify a single email address instantly.

How to use:
1. Enter an email address in the input field
2. Click 'Verify' or press Enter
3. See instant results: status, MX host, catch-all detection, and response time
4. Rate limited to 20 verifications per minute per workspace

Verification Statuses:

Catch-All Domains Explained:
Some domains are configured to accept emails sent to any address (e.g., [email protected] works). When the verifier detects this, it marks the email as 'risky' because it cannot confirm the specific mailbox exists. About 15-20% of B2B domains are catch-all. These emails are usually deliverable, but bounces are possible.

Batch Management:

Monthly Usage:

Prospect Limits by Plan:
Each plan has a maximum number of prospects you can store:
• Pro: 10,000 prospects
• Enterprise: 100,000 prospects
• Ultimate: 300,000 prospects
• Existing prospects are never deleted on plan changes — you just cannot add new ones if you're over the limit

Data Retention:

Best Practices:

FAQ:
Q: Does the verifier send any emails?
A: No. It asks the receiving mail server whether the address can accept mail and stops there — no message is ever delivered, and the person is never contacted.

Q: Will verification affect my sender reputation?
A: No. Checks run on our own separate infrastructure, never through your connected mailboxes, so nothing you verify touches your sending reputation.

Q: Why are some results 'Unknown'?
A: Some mail servers temporarily refuse verification attempts (greylisting, rate limiting). This does not mean the email is invalid. Try again later or include them in your campaign with caution.

Q: What happens to invalid prospects when I use 'Verify a List'?
A: They are automatically marked with status 'invalid' in your prospect database. They remain in the original list but will be skipped by campaigns that filter by status.

Q: Can I re-verify the same list?
A: Yes. Each verification creates a new batch and a new verified list. This is useful for re-checking lists after 30+ days.

Q: Do single email checks count toward my monthly limit?
A: No. Single checks have a separate rate limit (20/minute) but do not deduct from your monthly verification quota.

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 Integration:
Enable Bounce Shield in Settings to automatically:
• Pause campaigns when bounce rates exceed your threshold.
• Add bounced addresses to your suppression list.
• Alert you via email when issues are detected.

Best Practices:

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:

Limitations:

Best Practices:

Platform

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 ($15/seat/month per workspace; seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price)

Multiple Workspaces:

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:

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.

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

Best Practice: Use a subdomain of your sending domain (e.g., if you send from @acme.com, use track.acme.com).

Full step-by-step walkthrough with a worked example and FAQ: see 'How to use your own tracking domain' at /documentation/how-to-use-your-own-tracking-domain.

How to use your own tracking domain

A custom tracking domain lets the open, click, and unsubscribe links inside your cold emails use your OWN domain (like track.yourdomain.com) instead of the shared WarmySender domain. This guide walks you through what it is, why it helps your emails land in the inbox, the one DNS change you need to make, how to verify it, and what happens if it's ever unset or broken.

What a tracking domain is:

Every cold email you send can include invisible tracking so you can see who opened and who clicked, plus a one-click unsubscribe link. Those links have to live on a web address. By default that web address is a domain shared by many WarmySender customers. A custom tracking domain swaps in a small subdomain of your own — for example track.yourdomain.com — so the links in your emails match the domain you send from.

Why it improves deliverability:

Mailbox providers (Gmail, Outlook, and others) look at whether the links in an email line up with the domain that sent it. When your sending domain is acme.com and your tracking links are on a shared, unrelated domain, that mismatch is a small negative signal. When your tracking links are on track.acme.com — clearly part of your own domain — everything matches, which looks more trustworthy and helps your emails reach the inbox instead of spam. It also means your recipients only ever see your brand in the links, not a shared domain.

The one DNS step (add a CNAME):
1) In WarmySender, go to Settings > Tracking Domains and click 'Add Domain'.
2) Enter the subdomain you want to use — we recommend a 'track' subdomain of your sending domain, e.g. track.yourdomain.com.
3) WarmySender shows you the CNAME target to point at: track.warmysender.com.
4) Log in to wherever your domain's DNS is managed (for example Cloudflare, GoDaddy, Namecheap, Google Domains, or Route 53) and add ONE new CNAME record:
• Type: CNAME
• Name / Host: track (just the subdomain part — most DNS providers add the rest of your domain automatically)
• Value / Target / Points to: track.warmysender.com
• TTL: leave it on Automatic or 3600
5) Save the record. DNS changes usually take a few minutes but can take up to 48 hours to fully spread.

How to verify:

Back in Settings > Tracking Domains, click 'Verify' next to your domain. WarmySender confirms your domain is genuinely live end to end — that the CNAME is pointing to the right place AND that your domain securely serves your tracking links — not just that a DNS record exists. When it succeeds, the status turns to Verified and, from that point on, your campaigns automatically use your domain for open, click, and unsubscribe links. If it isn't ready yet, the status shows Error or Pending — double-check the CNAME name and target, give DNS a little more time, and click Verify again.

Status meanings:

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 show Pending or Error after I added the record?
DNS can take up to 48 hours to spread, though it's usually much faster. Confirm the Name is just the subdomain (track) and the Value is exactly track.warmysender.com with no extra characters, then click Verify again.

What happens if I delete the domain or its DNS later breaks?
Your campaigns keep sending. WarmySender automatically falls back to our default domain for tracking links the moment a custom domain is removed or stops working, so a broken tracking domain can never interrupt your sending.

Will switching to a custom tracking domain change my past open and click numbers?
No. It only affects links in emails sent from that point forward. Your existing stats stay exactly as they are.

Can I use one tracking domain across several campaigns?
Yes. Once a domain is Verified in your workspace, all of that workspace's campaigns use it automatically.

Still stuck? Contact us at [email protected] with the domain you're setting up. For instant answers, you can also open warmysender.com/documentation, click 'Copy Prompt to Clipboard,' and paste it into an AI assistant like Claude or ChatGPT along with your question.

Bounce Shield Protection

Bounce Shield is WarmySender's configurable bounce protection system:

Settings (from Settings > Bounce Shield):

How It Works:

  1. WarmySender monitors bounce rates across your recent sends
  2. When the bounce rate within the configured window exceeds your threshold, Bounce Shield activates
  3. If auto-pause is enabled, affected campaigns are paused to prevent further damage
  4. If auto-blocklist is enabled, bounced addresses are added to your suppression list
  5. You receive an email notification (if enabled)

This is in addition to the per-campaign safety metrics (5% bounce rate threshold with 50 minimum sends). Bounce Shield provides workspace-level protection across all campaigns.

Best Practice: Keep the default settings. Lower the threshold to 5% if you are very cautious about deliverability. Verify your email lists before importing to reduce bounces.

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

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. Honor Retry-After on HTTP 429 — we parse both seconds and HTTP-date formats, capped at our max backoff. After 10 failed attempts, the delivery is marked failed and the webhook's failure count is incremented.

Account Safety (LinkedIn Events):
WarmySender's webhook delivery does not make any LinkedIn API calls on your behalf — events are emitted from our own recorded state only, and each reply or acceptance is recorded exactly once, so a repeated upstream signal never produces a duplicate event or extra work. Toggling webhooks on or off doesn't change how often we poll LinkedIn via our LinkedIn provider; your LinkedIn account's daily action limits are driven by campaign sends / invites / profile views, not by webhook activity.

Testing:

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:

Zapier Integration

Connect WarmySender to 7,000+ apps using Zapier — no code required.

How It Works:
Zapier acts as a bridge between WarmySender webhooks and any app Zapier supports (HubSpot, Salesforce, Slack, Google Sheets, Airtable, Gmail, Notion, and thousands more).

Step-by-Step Setup:

Step 1: Create a Zap in Zapier
• Log in to zapier.com and click 'Create Zap'.
• For the trigger, choose 'Webhooks by Zapier'.
• Select trigger event: 'Catch Hook'.
• Zapier generates a unique webhook URL — copy it.

Step 2: Register the webhook in WarmySender
• Go to Settings > Webhooks > Create Webhook.
• Paste the Zapier webhook URL.
• Select which events to subscribe to (e.g., reply.received, email.clicked).
• Save the webhook.

Step 3: Send a test event
• Click 'Test' in WarmySender webhook settings.
• Go back to Zapier and click 'Test Trigger' — it should find the test event.
• Zapier will show you the payload structure.

Step 4: Add an action
Choose what happens when the event fires. Popular actions:
• HubSpot: Create/Update Contact
• Salesforce: Create Lead
• Google Sheets: Create Spreadsheet Row
• Slack: Send Channel Message
• Pipedrive: Create Person/Deal
• Gmail: Send Email (internal notification)
• Airtable: Create Record
• Notion: Create Database Item

Step 5: Map fields
Map WarmySender webhook fields to your action app:
• data.prospectEmail → Contact Email
• data.prospectId → External ID
• data.campaignId → Source Campaign
• type → Event Type

Step 6: Test and enable
Test the full Zap, then turn it on. Events from WarmySender will automatically trigger your action.

Popular Zap Recipes:

  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:

Make (Integromat) Integration

Connect WarmySender to 1,500+ apps using Make (formerly Integromat) for advanced automation workflows.

Why Make:
Make offers more complex branching, filtering, and data transformation than Zapier — ideal for multi-step automation with conditional logic.

Step-by-Step Setup:

Step 1: Create a new Scenario in Make
• Log in to make.com and click 'Create a new Scenario'.
• Add a trigger module: search for 'Webhooks' and select 'Custom webhook'.
• Click 'Add' to create a new webhook — Make generates a unique URL. Copy it.

Step 2: Register in WarmySender
• Go to Settings > Webhooks > Create Webhook.
• Paste the Make webhook URL.
• Subscribe to your desired events.
• Click 'Test' to send a sample event.

Step 3: Determine data structure
• Go back to Make and click 'Redetermine data structure' on the webhook module.
• It will detect the WarmySender payload fields automatically.

Step 4: Add action modules
Connect modules for your destination app:
• Router module — Branch based on event type (reply.received → one path, email.bounced → another).
• HubSpot module — Create/Update Contact, Create Deal.
• Google Sheets module — Add Row.
• Slack module — Send Message.
• HTTP module — Call any API.

Step 5: Add filters and routing
Make excels at conditional routing:
• Route 1: If type = 'reply.received' → Create CRM deal + Notify Slack
• Route 2: If type = 'email.bounced' → Update CRM status + Log to sheet
• Route 3: If type = 'email.clicked' → Score lead + Create task

Step 6: Enable the scenario
Set the scheduling to 'Immediately' (webhook-triggered). Toggle the scenario on.

Advanced Features:

Best Practices:

n8n Integration (Self-Hosted)

Connect WarmySender to n8n, the open-source workflow automation tool, to fan out events (email replies, LinkedIn replies, invite acceptances, bounces) into any downstream system — CRM, databases, Slack, Teams, Discord, Sheets, custom APIs.

Why n8n:

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

These are enforced by our systems at the MCP layer. Your underlying LinkedIn daily/weekly caps and warmup pacing are enforced separately by the scheduler — MCP cannot bypass them.

Pricing:
MCP access is included with any active WarmySender subscription. No separate charge. Your API key usage counts toward the rate limits above.

Next Steps:
See the guide "MCP Server — Install in Claude Desktop / Claude Code / Cursor / Windsurf / Zed" for copy-paste install snippets for each client. See "MCP Server — Available Tools Reference" for the full list of 60 tools. See "MCP Server — Safety, Scopes, and Rate Limits" for security and limits deep-dive.

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 (60 tools)

The WarmySender MCP server exposes 60 tools, grouped into eight capability areas: cold email & prospects, tracking domains, LinkedIn (campaigns, posts & recruiter), Instagram DMs, warmup & mailboxes, email verification, leads database, and workspace & jobs. Every tool enforces workspace scoping from your API key (ws_ prefix) — you can only see and touch data in your own workspace. Every LinkedIn and Instagram action is handed to our scheduler, which paces it within your account's safe ramp and daily/weekly caps; no tool sends outreach directly.

COLD EMAIL & PROSPECTS — 16 tools:

Campaigns:

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

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 ('WarmySender | Cold Email, Email Warmup, LinkedIn & Multichannel Outreach') because the broken Helmet library couldn't override the index.html defaults. Post-fix, the preview shows the actual article title and description.

If you're sharing a link and the preview looks wrong, check these in order: (1) the platform may be using a cached preview from before the fix — most platforms refresh after 24 hours; (2) the URL itself is correct (no typos that route to a different page or 404); (3) the page is actually indexed (paste it into Google's URL Inspection tool in Search Console to see what Google sees). If the og: tags look correct in the page source but the preview still looks wrong, force a refresh on the platform side (LinkedIn has a Post Inspector tool, X has Card Validator, Facebook has a Sharing Debugger).

What 'Page with redirect' means

A URL flagged as 'Page with redirect' means Google followed a 301/302 redirect from this URL to a different URL, and is now choosing to index the destination instead of the source. For WarmySender, this happens when an old URL (like /compare/warmysender-vs-instantly) redirects to its current canonical (/blog/compare/warmysender-vs-instantly). The redirect itself is correct and intended — Google is just being explicit that it has transferred indexing signal to the destination.

The related 'Page with redirect — Validation FAILED' status (which we cleared on May 16, 2026) means Google revisited the URL after a fix was claimed and still found it redirecting. The fix isn't 'remove the redirect' — that would break external links and bookmarks — it's 'remove every internal link to the old URL so Google stops re-discovering it via your own site'. An automated build check now blocks any future change that re-introduces an internal link to a legacy URL.

Reporting an SEO issue you spot

If you notice a page that should be indexable returning a 404, a sharing preview showing wrong information, or a page in Google that points at an old URL, please email [email protected] with: (1) the exact URL you visited, (2) the user agent (browser or share preview bot), and (3) a screenshot or HTML view-source of what you saw. We use these reports to extend the smoke test coverage — every confirmed issue becomes a new assertion in npm run seo:smoke so the same problem can't recur silently.

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: manage it on AppSumo. Move up or down a tier from your AppSumo account and your WarmySender plan updates automatically to match — there's nothing to re-activate on our side.

What's included: a full WarmySender plan — email warmup on a set of mailboxes, cold email campaigns with a monthly sending allowance, a built-in B2B leads database, and email verification. Higher tiers include more mailboxes, more sending, more leads, and more verifications, plus room for extra workspaces and teammates. LinkedIn and Instagram outreach are optional paid add-ons you can add anytime from inside the app.

Refunds: if you refund your purchase on AppSumo, your WarmySender access ends once the refund is processed.

Which email should I use? Any email you like — sign in with the one you want your account under. If you already have a WarmySender account, use that so everything stays in one place.

For the full walkthrough with FAQs, see /documentation/how-to-redeem-your-appsumo-code.

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.

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

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 — that was a fault on our side, not anything you did, and it is fixed. The approval screen now appears and the connection completes.

Once connected, an agent can create, launch and manage campaigns across cold email, LinkedIn and Instagram, add and enrol prospects, verify email addresses, and set up warmup — all in plain language. It never sends a message, invite or DM directly and it can never raise a limit: it hands the work to WarmySender's scheduler, which paces every action inside safe limits no matter who asked for it. Connecting and disconnecting accounts always stays in the app.

If you would rather skip the sign-in screen entirely, you can connect with a workspace key instead — see the AI Agents page for both routes.

Full explainer: /documentation/connecting-an-ai-agent-that-asks-you-to-sign-in

"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 — sending from that mailbox is blocked until you take action. This page explains exactly when WarmySender flags a mailbox for reconnection, what you should do, and what happens in the meantime.

First, the most important distinction: "Reconnecting…" vs "Reconnect required"

These two look similar but mean very different things, and customers often re-enter their password for the first one when nothing was actually wrong. Here is how to tell them apart at a glance:

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:

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?

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.

Warmup not sending emails or volume is very low

If your warmup is enabled but you see very few or no emails being sent, check these common causes:

  1. Mailbox Connection — Go to your mailbox and verify the status shows 'Connected'. If it shows an error or 'Disconnected', reconnect the mailbox.
  1. Warmup Toggle — Make sure warmup is actually enabled for the mailbox (the toggle should be on).
  1. Early Ramp Phase — If your mailbox just started warmup, the system begins with only 1-3 emails per day and gradually increases over time. This is normal and by design. Check your ramp speed setting.
  1. Subscription Status — Warmup requires an active paid subscription. If your subscription expired or was cancelled, warmup is automatically paused.
  1. Daily Limit Already Reached — If you are running campaigns alongside warmup, the combined volume may have reached your daily plan limit. Check your daily usage in the mailbox details.
  1. Recovery Mode — If the system detected reputation issues, it may have auto-switched your mailbox to Recovery mode, which intentionally reduces volume. Check your warmup strategy in the mailbox settings.
  1. Health Score Below Threshold — If your health score is very low (critical range), the system may temporarily reduce sending to protect your domain.

If none of these apply, try disconnecting and reconnecting your mailbox, then re-enabling warmup.

Campaign not sending

If your campaign is not sending emails, check the following: 1) Verify your mailbox is connected and showing a green status. 2) Check that your warmup health score is above 70 (campaigns may pause if deliverability is low). 3) Confirm your daily sending limit hasn't been reached for today. 4) Make sure your campaign status is 'Active' and not paused. 5) Check your sending schedule to ensure the current time falls within your sending window and on an active sending day.

"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 — works too, but LinkedIn may ask for a verification code, which is normal; the cookie method usually skips that step. Verification codes are LinkedIn's ordinary security check (confirming it's you, like a sign-in on a new device), so enter the code promptly — they expire fast — and request a new one if it lapses.

If it keeps failing: sign in to linkedin.com in a normal browser tab first and complete anything LinkedIn shows you (a prompt or security check) — a connection can't finish while LinkedIn is waiting for you to clear something — then come back and try again, ideally with the browser-cookie method (the safest), making sure you're connecting the right account. Wait for the short countdown between tries.

Still stuck? Email [email protected] with roughly the time it happened and which method you used, and we'll look into it. Full explainer with a worked example and FAQ: /documentation/why-wont-my-linkedin-account-connect

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's circuit breaker automatically detects restrictions and pauses your LinkedIn campaigns. 4) After the restriction lifts, the system will automatically resume with reduced limits and ramp back up gradually over 4 weeks. To prevent future restrictions: keep daily connection requests under 20, personalize every invite note, avoid sending on weekends, and let the warmup ramp-up complete fully before increasing volume. If your account is permanently restricted by LinkedIn, you will need to appeal directly through LinkedIn's help center.

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 safety thresholds are exceeded. This protects your sender reputation. Triggers: 1) Bounce rate exceeds 5% (default threshold). 2) Spam complaints reach the configured limit (default: 3 complaints). Cooldown lasts 24 hours minimum. After 24 hours, the system checks if metrics have improved — if yes, the campaign resumes automatically; if not, cooldown is extended. To fix: 1) Check your prospect list quality — remove invalid or catch-all email addresses. 2) Verify your DNS records (SPF, DKIM, DMARC) are correct. 3) Lower your daily sending volume. 4) If bounce rate was the trigger, enable Bounce Shield in Settings to pre-validate emails. The campaign status will show 'Cooldown' in orange on your Campaigns page.

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. Common issues: 1) 'No CNAME record found' — You haven't added the DNS record yet, or it hasn't propagated. Add a CNAME record for your chosen subdomain (e.g., track.yourdomain.com) pointing to track.warmysender.com. 2) 'CNAME record points to wrong target' — Your CNAME points somewhere else. Update it to point to track.warmysender.com exactly. 3) DNS propagation can take up to 48 hours — try verifying again later. 4) Some DNS providers require you to enter the subdomain only (e.g., 'track') without the full domain. 5) Make sure you don't have conflicting A records on the same subdomain. After verification succeeds, select the tracking domain in your campaign settings to use it for open and click tracking.

Emails landing in Promotions or spam folder

If your campaign emails land in Promotions or spam: 1) Check DNS records — SPF, DKIM, and DMARC must all be configured correctly. Use a tool like MXToolbox to verify. 2) Reduce HTML and images — plain-text-style emails with minimal formatting have higher inbox placement. 3) Avoid spam trigger words — 'free', 'guarantee', 'act now', 'limited time' in subject lines. 4) Warm up your mailbox first — run warmup for at least 2-3 weeks before starting campaigns. 5) Keep your volume low initially (20-30 emails/day) and increase gradually. 6) Personalize every email — use merge tags so each email is unique. 7) Set up a custom tracking domain to avoid shared tracking domain reputation issues. 8) Monitor your warmup Health Score — if it drops below 60, pause campaigns and let warmup recover your reputation. 9) Use Bounce Shield to filter out invalid emails before sending.

How unsubscribe links work

WarmySender automatically adds a visible unsubscribe link to every campaign email — no setup needed. You do not need to add anything manually in the campaign editor.

What happens automatically:

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.

Campaign paused or not running within sending window

If your campaign appears paused or is not sending emails even though it is within the active sending window, check these common causes:

  1. Subscription status — If your subscription expired, was cancelled, or payment failed, all campaigns are auto-paused. Check Billing page for your subscription status. Campaigns auto-resume when you re-subscribe.
  1. Campaign status — Make sure the campaign status is 'Running' (not 'Draft', 'Paused', 'Cooldown', or 'Completed'). Check the Campaigns page for the status badge.
  1. No available mailboxes — All assigned mailboxes may be disconnected, in error state, or have hit their daily limits. Check Mailboxes page for connection status. At least one mailbox must be active and connected.
  1. Daily limit reached — Your plan's daily sending limit or per-mailbox daily limit may be exhausted. Check your Billing page for usage. Limits reset at midnight.
  1. Bounce rate exceeded — If your campaign's bounce rate exceeded 5% (default threshold) with at least 50 sends, it enters 'Cooldown' mode automatically. Check campaign analytics for bounce rate.
  1. Sending window mismatch — Verify the campaign's sending window (start/end hours) and timezone match when you expect sends. A campaign set to 9 AM-5 PM Eastern won't send during those hours Pacific.
  1. Schedule days — Check that today is an active sending day. If the campaign is set to Mon-Fri only, it won't send on weekends.
  1. No eligible prospects — All enrolled prospects may have already been contacted, replied, bounced, or unsubscribed. Check the campaign's prospect enrollment status.
  1. Campaign end date passed — If you set an end date and it has passed, the campaign stops automatically.
  1. Rate limiting backoff — After hitting a rate limit, the system backs off before retrying. This can cause temporary pauses of 1-60 minutes.

How to Diagnose:

If none of these apply and your campaign is still not sending, contact support at [email protected] with your campaign name and account email.

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.

Slow warmup progress or low daily volume

If your warmup volume seems stuck or is ramping up too slowly:

  1. Normal behavior — New domains start at 1-3 emails/day with Conservative ramp. This is intentional to protect your domain. The system increases volume gradually over 2-4 weeks.

2) Check your ramp speed — Go to Warmup, click your mailbox, and check the ramp speed setting:
• Conservative: 0.08 growth rate (slowest, safest for new domains)
• Normal: 0.12 growth rate
• Aggressive: 0.20 growth rate (only for established domains)
If you are on Conservative and your domain has some history, consider switching to Normal.

  1. Check your daily volume cap — Your configured max daily warmup emails may be limiting volume. The system ramps toward this target but won't exceed it.
  1. Recovery mode — If your mailbox auto-switched to Recovery mode due to high bounce or spam rates, volume is intentionally reduced. Check your warmup strategy in mailbox settings. Let Recovery complete before expecting higher volume.
  1. Shared quota — If you are running campaigns, warmup and campaigns share the daily sending limit. Campaign sends reduce available warmup capacity.
  1. Peer availability — During off-peak hours or with a small warmup pool, fewer peers may be available. This is temporary and self-correcting.
  1. Connection issues — Verify your mailbox shows 'Connected' status. A disconnected mailbox cannot send or receive warmup emails.
  1. Plan limits — Check that your subscription is active. Free or expired plans may have reduced warmup capacity.

If volume has been stuck at the same level for more than 7 days with no obvious cause, disconnect and reconnect your mailbox, then re-enable warmup.

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. Automatic protection — WarmySender tracks spam complaints. If complaints exceed your campaign's threshold (default: 3), the campaign enters Cooldown mode and stops sending.

3) Immediate steps:

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
• Check your spam or junk folder — it's the single most common cause. Marking the message as 'not spam' helps future codes land properly.
• Make sure you used the address you actually signed up with. If you typed a different address, we may have sent the code somewhere you're not looking (see 'My account looks empty' below).
• Give it a minute. Codes usually arrive within seconds, but a busy mail provider can add a short delay.
• Still nothing? Request a new code and try again — you can request as many as you need.

The code says it's expired or invalid
Codes are short-lived on purpose, so an old email won't let anyone in later. If yours has expired, request a new one and use the most recent email — an older code in your inbox will not work. Type the digits rather than pasting, in case a stray space came along with the copy.

My account looks empty, or I'm being asked to choose a plan I already pay for
This usually means you're signed in with a different email address than the one you subscribed with — not that anything is lost. People sign up with a work address and later sign in with a personal one, or with a slightly different spelling, or with an address that forwards into the same inbox. Everything you set up is safe under the other address.
To check: compare the email address shown in Settings against the address on your billing receipt or card statement. If they differ, use the 'Try another email address' option on the sign-in screen — enter the other address and we'll send a sign-in code straight to it, so you can get into the right account without starting over. Do not delete the empty-looking account; it won't stop any billing and it can't be undone. See /documentation/cancel-or-delete-your-account.

Session expired / you were signed out
Sessions last 30 days. After that you sign in again with a fresh code. That's normal security behaviour, not a fault.

Browser issues
• Clear cookies and cache for warmysender.com.
• Try a private / incognito window.
• Turn off extensions that block cookies (ad blockers, privacy tools) for warmysender.com.
• Make sure cookies are enabled for warmysender.com — sign-in can't be remembered without them.

Multiple workspaces
If you belong to more than one workspace, you're in one at a time. Use the workspace switcher in the sidebar to move between them.

Access limited after a subscription ends
If your subscription expired or was cancelled, you can still sign in — access is just limited to the Billing page so you can reactivate.

Too many attempts
After a lot of rapid sign-in attempts you may be asked to wait a few minutes before trying again. Give it about 15 minutes and try once more.

Invited to a workspace but can't get in
• Make sure you opened the invitation email and clicked the link in it.
• Sign in with the exact email address the invitation was sent to — an invitation is tied to that address.
• Ask the workspace owner to check your invitation status in Settings > Team.

Still stuck? Email [email protected] from the address you're trying to sign in with, and tell us what you see on screen. We answer within 24 hours on business days.

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) Circuit Breaker Triggered:
If 10 or more enrichment errors occur in a single day, the circuit breaker stops enrichment to protect your account. This can happen if LinkedIn is temporarily rate-limiting your profile views. Solution: Wait 24 hours for the circuit breaker to reset, then restart enrichment from the Audiences page.

3) Audience Was Deleted:
If you deleted and recreated an audience while enrichment was running on the old one, the job fails with 'Audience was deleted'. This is expected — simply start enrichment on the new audience.

4) Daily Cap Reached (Not a Failure):
If enrichment shows 'Paused' (not 'Failed'), it has reached the daily cap and will resume automatically at midnight UTC. This is normal behavior — no action needed.

5) Multiple Failed Connection Attempts:
If your LinkedIn account keeps disconnecting, there may be an issue with your LinkedIn session or proxy. Try: a) Reconnect with fresh credentials, b) Check your proxy settings in LinkedIn > Accounts, c) Verify your LinkedIn account is not restricted by LinkedIn itself.

After Fixing the Issue:

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

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 prospect replies to one of your campaign emails with an Out of Office message, WarmySender handles it automatically so your sequence is not accidentally ended.

Automatic Detection in 5 Languages
We auto-detect Out of Office replies in English, Dutch, German, French, and Spanish. The system scans incoming replies for common Out of Office phrasing and headers in each language and classifies them accordingly.

Out of Office Does NOT Terminate Enrollment
An Out of Office reply is treated as 'the lead is on vacation, not rejecting you'. It does not stop the sequence. The campaign automatically resumes its sequence for that lead once they return and the normal scheduling kicks back in — so you do not lose the lead, and you do not accidentally burn the follow-up by treating a vacation bounce as a real reply.

If We Miss an Out of Office (Rare)
Occasionally a reply uses very unusual phrasing that the detector misses (for example, an internal custom auto-reply in a language we do not yet support). If you spot one in your inbox and it was classified as a normal reply, you can fix it manually:

  1. Open the Unified Inbox and click the reply in question
  2. Change the sentiment to 'Out of Office'
  3. Save

As soon as you mark the reply as Out of Office, the campaign immediately resumes its sequence for that lead.

What Happens Next
Leads marked as Out of Office return to Pending status and pick up their next sequence step on the next scheduler tick. You do not need to re-enroll them or take any further action — the system will continue the sequence automatically on schedule.

Best Practice
If you notice a specific phrasing the detector keeps missing, report it to support so we can improve coverage. Out of Office detection is continually refined based on real-world examples.

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 $15/seat/month (or $120/seat/year — 33% off — on annual billing), available on any paid plan. Seats added before July 6, 2026 keep the rate they were created at — existing customers are never moved to the new price. New orders are $15/seat/month, or $120/seat/year (33% off).

Key details:

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.

How do I change my mailbox's daily sending limit?

Go to the Mailboxes page, open the row's dropdown menu, and click 'Edit Daily Limit' (also available from the mailbox's View Details page). Enter the new value and save — the change is live on the next scheduler tick. You do NOT need to disconnect or reconnect the mailbox, and no campaigns are disrupted.

Remember the MIN-of-three rule: sending is capped by the MINIMUM of the mailbox's daily limit, the campaign's dailySendLimit, and the campaign-mailbox maxSendsPerMailboxPerDay — whichever cap is hit first stops sends. Warmup volume is tracked separately and is not affected by this setting.

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 an account triggers a LinkedIn restriction, WarmySender auto-switches to recovery mode with ramp_week=1 and a fresh ramp_start_date so the account re-warms safely from scratch.

What happens when InMail credits run out

When your Sales Navigator (or Premium / Recruiter) account uses its last InMail credit and LinkedIn reports "not enough credits", WarmySender stamps an account-level credits-exhausted flag. For the next 24 hours every InMail step on that account is skipped — the prospect advances to the next step in your sequence (or completes the sequence if InMail was the last step) instead of holding a slot in the campaign’s daily send budget. After 24 hours WarmySender re-tries one InMail; if your credits have been topped up the flag clears automatically and normal sending resumes. This protects your daily send budget so connection invites and follow-up messages keep flowing while InMails are paused, and it prevents a doomed call burning your per-account API budget. Sales Navigator credits also fully reset on the 1st of every calendar month — that auto-clear is independent and stricter.

Why isn’t my campaign sending faster?

Every LinkedIn campaign in WarmySender passes through a stack of caps before each action fires. Sending throttle is never the result of a single number — six independent caps are evaluated for every send, and the LOWEST one wins. The Throttle Diagnostic panel on the campaign detail page surfaces which cap is binding right now so you do not have to reason about the stack manually.

The cap stack — in evaluation order

  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. Strategy ramp. Independent from the account-type ramp. Selected at connection time based on declared account age: new_account (6-week ramp), established (4-week), veteran (2-week), recovery (8-week, after a restriction), custom (user-defined, no ramp). The strategy ramp clamps invites, messages, InMails, profile views, and engagements per week. Final cap = MIN(account-type ramp, strategy ramp).
  4. Campaign daily_send_limit. The per-campaign budget you set in the wizard. Counted as the SUM across action types — one invite + one message + one InMail = three of the daily budget.
  5. Per-action sub-caps. Each action type has its own daily ceiling: invites/day = ceil(weekly/7) with a floor of 10, messages/day from the strategy, InMails/day from MIN(strategy, account-type cap, custom override, hard cap = 50), profile views/day from the strategy. Hitting one sub-cap blocks ONLY that action type — the campaign keeps sending other action types.
  6. Per-account weekly invite cap. 100/week for paid accounts (Sales Nav can stretch to 200), 100/week for free. The weekly counter resets every Monday at 00:00 UTC. Hitting this is the most common “why is my campaign frozen until next week” pattern.
  7. InMail credits. Sales Navigator includes 50 InMail credits / month, Premium includes 5, Recruiter 100+. When LinkedIn returns “Not enough credits” on a send, an account-level circuit-breaker (inmail_credits_exhausted_at) blocks all InMail steps for that account until LinkedIn refills (top of next month for Sales Nav). Invites and regular messages keep flowing.
  8. Cooldown signal (cannot_resend_yet). If LinkedIn returns HTTP 422 with cannot_resend_yet, WarmySender sets a 4-8h account-level back-off and ALL action types pause. Every retry inside the window deepens the cooldown. See Cooldown troubleshooting.

Worked example — Sales Navigator veteran, week 4

You have one Sales Navigator account on the veteran strategy (2-week ramp, completed) and a campaign with daily_send_limit = 50 running invite-only steps. Mon-Fri, 09:00-17:00 UTC.

Cap layerValueEffective per day
LinkedIn safe rate (Sales Nav, paid)100 invites / week~14 / day (spread)
Account-type ramp (week 4)50 invites / day50 / day
Strategy ramp (veteran, week 4)200 invites / week29 / day
Per-account weekly invite cap200 / week29 / day
Daily invite sub-capceil(200 / 7)29 / day
Campaign daily_send_limit50 / day50 / day
Binding capMIN of all rows29 invites / day

The Throttle Diagnostic panel will say: “Daily invite cap reached — resumes tomorrow at midnight UTC” once 29 invites have fired, even though the campaign daily limit is 50. The narrowest cap wins. Raising daily_send_limit to 100 would NOT help — the strategy/weekly ramp still tops out at 29 invites/day. To send more: (a) wait for the strategy ramp to complete and weekly cap to widen, or (b) add MORE LinkedIn accounts to the campaign so each operates within its own ramp.

Common diagnostic outputs & what to do

What the panel saysWhat to do
Daily send limit reachedWait — resets at midnight UTC. To raise, edit the campaign and increase daily_send_limit, but only if the per-action / weekly caps still have headroom.
Invite cap reached for this weekWait until Monday — weekly counter resets at 00:00 UTC. Or add another LinkedIn account to the campaign — each gets its own weekly bucket.
InMail credits exhaustedTop up credits in LinkedIn. Sales Nav refills 50/month at the top of each calendar month. The breaker auto-clears on first successful InMail or month rollover. InMail steps are skipped meanwhile; invites and messages keep flowing.
View profile cap reachedWait — resets at midnight UTC. View-profile is a soft action; campaigns rarely use it as a hard step.
Account on conservative ramp (week N of M)Wait one calendar week or change strategy. Strategies can be changed in Settings › LinkedIn › Strategy. Switching from new_account to veteran mid-flight is allowed but raises ban risk on accounts < 6 months old.
Account in LinkedIn cooldownWait — do NOT manually retry. Every retry inside the window deepens the cooldown. The panel shows the exact resume time.
Sending normallyNo action. The campaign is firing as fast as the safety stack allows. To raise throughput: add more LinkedIn accounts or wait for the strategy ramp to complete.

Why the panel surfaces only ONE binding cap

Historical “automation stops very early” tickets came from users seeing a partially-filled campaign daily-budget bar (e.g. 30% used) and assuming the system was broken — when in fact a different lower cap (e.g. weekly invite cap) was the actual binding constraint. The diagnostic deliberately picks ONE cap to explain the throttle, with priority going to the cap that locks for the LONGEST window: cooldown > weekly > daily > ramp. The per-action breakdown rows let you verify the math.

Account-safety contract

The Throttle Diagnostic is a UX hint — it does NOT influence dispatch decisions. The actual gate is enforced on the server side. The diagnostic helper makes ZERO LinkedIn API calls and ZERO new database writes — it reads from the same data the campaign detail page already loads. Account safety always wins over throughput.

Related

Acceptance vs reply tracking

Definitions

Example timeline A — accept, then a follow-up message, then a reply

Day 0  09:00   Step 1 invite sent          (linkedin_invite_sent_at)
Day 2  14:12   Acceptance webhook fires    (linkedin_accepted_at)
Day 3  09:00   Step 2 follow-up message    (linkedin_last_messaged_at)
Day 5  17:42   Inbound reply               (linkedin_replied_at)

Counters at Day 5: acceptance=1, reply=1, accepted_to_reply=3d 3h

Example timeline B — reply webhook lands before acceptance webhook

Day 0  09:00   Step 1 invite sent
Day 0  09:18   Reply webhook 09:18:42; acceptance webhook 09:18:48
Both counters stamp:
  linkedin_accepted_at = 09:18:48
  linkedin_replied_at  = 09:18:42

Even when the reply webhook lands first, the acceptance helper still stamps linkedin_accepted_at — both counters reflect reality. The status flip to connected is suppressed because replied is a strictly later state, but the stat counter is independent of the status field.

Daily send limit and LinkedIn capacity

Each campaign has a Daily limit setting that caps how many actions the campaign can take per day. For LinkedIn campaigns the right value depends on your account's tier and ramp strategy: a Sales Navigator account can sustain ~28 invites/day plus messages and profile views, while a brand-new Free account should stay below 80 actions/day. If your campaign's daily limit is set below what your account can produce, the cap becomes the binding constraint and your campaign will throttle below LinkedIn's safe production rate. WarmySender now picks a tier-aware default at campaign creation and shows a warning banner on the campaign detail page when the cap is below the account's expected daily capacity.

Recommended daily limit by account tier

LinkedIn account 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. That number comes from the warmup_sent_today counter on the mailbox row, which increments by one each time the warmup engine successfully hands a message to your SMTP server. The counter is reset to zero at your mailbox's local midnight — not at global UTC midnight — so a Pacific-time mailbox flips at 00:00 PT (08:00 UTC) and an Australian mailbox flips at 00:00 AEST (14:00 UTC the day before). The reset job runs every five minutes and is idempotent; a deploy or restart in the middle of the day will never cause a double-reset.

Example: on Friday at 9 am Pacific your dashboard might show 12 sent; by 6 pm Pacific the same day you will typically see 30+ as more sends complete throughout your warming window. The number only ever grows during the day and resets cleanly at your local midnight.

During the day, the counter may briefly diverge from the per-mailbox event log by one or two if the engine is mid-flight between "message sent" and "counter incremented." Both writes happen inside a single transaction, so the drift never exceeds the in-flight count and self-corrects within seconds. The dashboard API also reconciles the displayed value against the event log so a stale counter can never display a wildly wrong number.

Deliverability lag — why the inbox/spam % grows during the day

After a warmup message is sent, the recipient mailbox needs a few minutes to receive it, the IMAP scanner needs to discover it in the INBOX or SPAM folder, and the engine then records the placement. The full cycle typically takes 3–30 minutes from send to detection, but can stretch to a few hours during heavy provider load. This means the Inbox % and Spam % metrics on the dashboard reflect completed detections, not just sends — so they will visibly climb throughout the day as the morning's messages get scanned.

If you check at 9 am you might see 30 sent but only 8 detected, giving a deliverability metric based on those 8. By 6 pm the same day, the same metric typically reflects 25–30 detections out of 30 sent — a much more accurate picture. Never panic over an inbox % computed before lunch; let the day complete before drawing conclusions.

Why warmup paused — reading the pause reason

When warmup stops on a mailbox, the system records a structured pause reason that tells you exactly why. Reasons fall into two broad groups: billing (your subscription or trial cannot keep funding warmup) and technical (the mailbox itself is failing). Resume the right way for each.

Why it 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 all four pillars of the platform — cold email campaigns, email warmup, LinkedIn outreach, and multichannel sequences all wait for an active plan before they run.

Once your payment clears and your subscription is active again, warmup resumes automatically within a few minutes — you don't need to restart anything, and your earlier warmup progress is preserved, so your mailboxes pick up where they left off instead of starting the ramp from day one. To clear the pause: update your card under Billing › Payment Method, confirm the payment goes through, and give it a few minutes.

Settling the invoice is the only thing that clears this, and it is worth saying plainly why. Switching warmup back on yourself first does not work: warmup needs an active plan behind it, so the switch is refused while an invoice is outstanding — and if it did flip on, a routine check would restore the pause a few minutes later. Rather than leave you pressing a button that cannot succeed, we would rather tell you: pay the invoice, then wait a couple of minutes and everything returns by itself. If a mailbox is still paused well after your payment has cleared, open its per-mailbox detail page to see the current reason, or contact us at [email protected].

When in the day does warmup send?

Warmup runs around the clock. We deliberately spread your warmup messages across all hours of the day rather than confining them to set "office hours" — genuine inboxes receive mail at every hour, so steady round-the-clock activity looks more natural to inbox providers than traffic squeezed into a narrow daily window. Because of this, warmup has no per-hour send window to set: every enabled mailbox automatically sends a small, steadily-ramping number of messages spread throughout the day.

What changes over time is the number of messages per day, which ramps up gradually as your mailbox builds reputation (see the ramp section below) — not the hours they go out in. Time-of-day control for your own prospect outreach is set per campaign, separately from warmup.

Ramp — how the daily limit grows over time

A brand-new mailbox is not sent at its warmup_target_daily_volume on day one. Instead the engine uses warmup_current_daily_limit, which starts low (typically 5–10 messages on day one) and ramps upward each day toward the target. The ramp speed depends on the mailbox's warmup mode (new_mailbox, new_domain, maintenance, recovery) and on the mailbox's recent health (spam rate, bounce rate, inbox placement).

Once a mailbox graduates to maintenance mode (about 14 days old with a clean health profile), the per-day limit converges on your configured target. If health deteriorates the engine can throttle the limit back down automatically — that's a feature, not a bug.

When numbers look surprising — quick diagnostic checklist

  1. Check the timezone. If "Sent today" looks higher than expected, confirm the mailbox warmup_timezone matches your real geography — a misconfigured timezone makes "today" cover up to 48 hours of real sends.
  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 ($15/seat/month), then go to LinkedIn > Connect Account. WarmySender uses an official OAuth integration for safe authentication — no password sharing required.

What email providers does WarmySender support?

Gmail, Google Workspace, Outlook, Microsoft 365, Yahoo, Zoho Mail, Hostinger, iCloud, Fastmail, ProtonMail, and any provider with IMAP/SMTP access.

How do I check my email deliverability?

Go to your Mailbox dashboard to see inbox placement rate, warmup score, and sender reputation. WarmySender tracks these metrics automatically for all connected mailboxes.

How do I import prospects for campaigns?

Go to Prospects > Import. Upload a CSV file with columns for email, first name, last name, and company. You can also add prospects manually or use the built-in B2B lead database.

What is Bounce Shield and how does it work?

Bounce Shield is WarmySender's built-in email verification. It checks prospect addresses before sending and holds back the ones confirmed undeliverable, removing most avoidable bounces and protecting your sender reputation. It runs automatically on campaign activation. Verification reflects the moment it runs, so a verified list can still bounce a little.

Why is LinkedIn enrichment taking so long?

Enrichment is rate-limited to protect your LinkedIn account. Daily caps range from 10-100 profiles/day depending on account age and strategy. New accounts start at ~10/day and increase each week. You can start campaigns immediately without waiting for enrichment.

Why does enrichment use my LinkedIn account instead of a system account?

LinkedIn requires an authenticated session to view profiles — there is no public API. A shared system account would be banned within hours. Using your own account also provides network-specific data like connection degree. All LinkedIn automation tools work this way.

Can I start a LinkedIn campaign without enrichment?

Yes. Campaigns only need LinkedIn profile URLs to function. Enrichment adds extra data (name, company, headline) for personalization but is completely optional. Create and launch your campaign immediately — enrichment runs in the background.

My LinkedIn enrichment failed — what should I do?

Common causes: account disconnected during enrichment, circuit breaker triggered after 10+ errors, or audience was deleted. Reconnect your LinkedIn account, go to Audiences, and click Restart Enrichment. Previously enriched profiles are cached.

Why does my campaign say 'paused' with no reason?

This was a real bug, fixed in late April 2026. Earlier, a campaign could be paused without recording a pause reason, so the auto-resume sweeper couldn't tell whether the underlying issue (account disconnect, high failure rate, etc.) had cleared. The fix records a structured pause reason on every pause and rejects any future regression at the database layer. Open the campaign detail page and look at the pause reason — it now always tells you why the pause happened (account disconnected, high failure rate, subscription canceled, etc.). If the field is still empty, your campaign predates the fix; click Resume once and the system will re-evaluate the row, populate a reason if there's a real cause, or move it back to running if not. Your prospects, sequences, and analytics are completely untouched by the fix.

I imported Sales Navigator URLs but most of my prospects didn't get invites — what happened?

Sales Navigator URLs (the form `https://www.linkedin.com/sales/lead/ACoAAA...,NAME_SEARCH,XYZ`) sometimes can't be resolved to a public LinkedIn profile. This happens for restricted profiles, recently-deleted leads, and a known issue with certain `,NAME_SEARCH,` query suffixes. Before late April 2026, when resolution returned nothing, our campaign engine treated the prospect as 'cannot be invited, mark complete' — silently completing the prospect with zero invite attempt. The fix shows affected prospects as Unresolved URL and retries with exponential backoff up to 5 times before promoting to a terminal Failed state. They never complete silently again. To recover prospects affected by the old behavior: re-import them with regular `linkedin.com/in/<handle>` URLs (most reliable), or run the recovery routine which automatically re-stamps eligible prospects so they re-enter the queue on the next campaign tick. Your campaign config and other prospects are untouched. If you're unsure whether your import is affected, contact support — we can check the resolver outcome for any prospect by ID.

I see my invite counter went up but the dashboard says 0 invites — is the counter wrong?

No, the counter is correct. WarmySender ships two LinkedIn campaign engines that both increment the weekly invite counter on your account: a standalone engine (LinkedIn-only campaigns) and a unified multichannel engine (campaigns combining email and LinkedIn steps). Both engines hit the same shared counter, but campaign activity is tracked separately per engine. If the dashboard's per-campaign count looks lower than the counter, you're likely viewing a standalone campaign while the missing invites came from a unified multichannel campaign on the same account, or vice versa. The counter is the single source of truth for rate-limit gating, so it's never wrong. To see total invites across both engines for an account, the LinkedIn Accounts dashboard now shows invites sent this week vs. weekly limit directly (engine-agnostic). If the numbers still don't add up after a 5-minute refresh, contact support — we can run a canonical diagnostic.

Why am I getting 'reconnect needed' emails when my LinkedIn is showing connected?

This is a stale health flag left over from a prior upstream outage. Your account is genuinely connected and our system is communicating with LinkedIn fine — but a derived health marker didn't reset when the reconnect succeeded, and our daily alert-email job kept firing on it. The late-April 2026 fix makes this permanent: the reconnect path now resets the health marker alongside the other recovery markers, the alert email is gated to skip any connected account, and a drift sentinel surfaces any future regression to admins before customers see it. If you still see the email after the fix is deployed, click Reconnect once from LinkedIn → Accounts (your campaigns and prospects are untouched) and the flag will reset cleanly.

I see prospects who replied on LinkedIn but my dashboard says 0 replies — what's wrong?

This was a real bug, fixed in late April 2026. Reply detection was relying on a campaign attribution that wasn't being populated on inbound LinkedIn messages — neither the webhook ingest path nor the polling fallback was running the attribution lookup before storing the message. Net: every inbound LinkedIn message landed in the database with no campaign attribution, the dashboard reply count, auto-stop-on-reply check, and analytics reply-rate roll-up all silently filtered them out, and the dashboard showed 0 replies even when prospects had clearly responded. Worse: campaigns kept sending follow-ups to prospects who'd already replied. The fix adds an attribution lookup that the webhook handler and the polling fallback both run before recording inbound messages — so every inbound message is now correctly attributed to its enrollment if one exists. We also ran a one-shot 120+ row backfill that retro-fits the lookup against historical unattributed rows. Reply stats refresh within 1 hour after the backfill runs. If you still see drift after that window, contact support — we can re-run the backfill against your specific workspace.

Many of my prospects say 'Profile inaccessible' — are they lost?

No — late-April 2026 fix. Previously, every Profile-inaccessible response from LinkedIn was treated as terminal and the prospect was completed with no further retry — even though that response conflates several distinct cases, including some that are recoverable on a re-resolve (Sales Navigator URLs that didn't resolve on attempt N but resolve cleanly on attempt N+1, and URL canonicalization issues fixed by a related ID-aware fallback). The platform-wide audit found 21,868 enrollments completed this way. The fix migrates all of these to a defer-not-burn flow: the prospect's status flips to Pending Resolution instead of terminal Failed, the engine retries with exponential backoff capped at 5 attempts before promoting to terminal Failed, and the 21,868 historical rows were swept into the same recovery flow with their re-attempts spread over a 24-hour window so the queue doesn't slam LinkedIn rate limits. If you see this status: please verify the prospect's LinkedIn URL is current (regular `linkedin.com/in/<handle>` URLs resolve most reliably), and click Retry on the prospect detail page. The defer flow handles the recovery automatically — no further action needed unless you see the prospect repeatedly land back in Pending Resolution after 5 retries (which would indicate a genuinely-terminal restricted profile).

My LinkedIn replies aren't showing on the dashboard — what's happening?

If your dashboard is missing recent LinkedIn replies even though prospects are clearly replying on LinkedIn, the most likely cause is an upstream webhook outage at our LinkedIn integration. Important first: every reply is still safely in your LinkedIn inbox — nothing is lost on LinkedIn's side. The gap is purely between our integration and WarmySender, not between you and your prospect. When webhook delivery stalls, the inbound message still reaches our database via a 30-minute polling fallback, but the dashboard side-effects that the webhook normally triggers (the replied-at stamp on your prospect, the auto-stop-on-reply check, the Slack/n8n/Zapier reply notification, and the dashboard reply counter) only fire when the webhook handler runs. So during the outage you may see follow-ups continue on threads where the prospect already replied. Our detection infrastructure catches this within 15 minutes: a webhook health monitor compares the rate of inbound messages landing in our database against the rate of webhook events received, and raises an internal alert when the ratio drops. The runbook then lets us (1) escalate to restore the webhook, (2) confirm the polling fallback is bridging the gap at 30-minute cadence, and (3) once the webhook is back, run an idempotent replay backfill that re-drives the missed reply state-flips from the locally-stored inbound rows. The replay retroactively applies stop-on-reply, so dashboard counters reflect ground truth within ~1 hour of recovery. The detection and replay layer makes zero LinkedIn API calls — account safety always wins. If you suspect this is happening to your workspace, contact support at [email protected] with a sample prospect URL and approximate reply timestamp; we can verify the per-account state and confirm the recovery timeline.

I imported a CSV with custom fields but my template variables show 'undefined' — what should I do?

Late-April 2026 fix. Previously, if your campaign template referenced a custom variable like `{{custom.Linkedinconnection}}` and your imported CSV didn't have that column (typo, missing column, capital-letter mismatch), the campaign engine had two failure modes depending on the era: render the message with a literal 'undefined' and send anyway (rude), or complete the prospect as Failed with no recovery path. The fix is two-layer: (1) Validate-at-launch — the campaign launch path now enumerates every `{{custom.<name>}}` reference in your template, intersects against the actual column set in your prospect data, and BLOCKS launch with an actionable error if any references aren't satisfiable. The error names the missing column AND lists every column that DOES exist, so you can either fix the typo, edit the template to remove the missing variable, or re-import the CSV with the column populated. (2) Defer-at-send — if a template variable somehow still unresolves at send time (race: campaign launched, then the audience had a column dropped before the send fired), the runtime renderer now parks the prospect as Pending Template Variable Resolution instead of completing as Failed. The prospect re-enters the queue on the next campaign re-evaluation, so once you fix your template OR re-import the CSV with the corrected column, the affected prospects retry automatically — no manual recovery needed. If you see this on existing prospects: either edit your template to remove the missing variable, or re-import the CSV with the column populated, then click Resume — those prospects will retry within a campaign tick.

Why are some of my prospects shown as accepted but never received a follow-up message?

Three scenarios: (1) The LinkedIn account was disconnected at the moment the follow-up was supposed to fire — the engine cannot send through a disconnected account (account safety always wins) and parks the enrollment until you reconnect. The auto-resume sweep wakes parked enrollments within 5-10 minutes of reconnect. (2) The follow-up step was a 'wait for acceptance' condition that already evaluated and routed the prospect down the false branch because the wait window expired before the acceptance landed — this is the campaign's correct end state per how you configured it. (3) Silent skip from a worker race or a campaign edit mid-flight — the genuinely-stuck pattern. Symptom: the prospect shows accepted but no follow-up message went out and no error event was recorded. We ship a periodic post-acceptance enqueue helper and an orphan-job reconciler that catches these and recreates the missing send job. In late April 2026 we ran a one-shot backfill against a 422-row cohort. If you suspect a stuck row, contact support at [email protected] with the prospect URL — we can manually re-arm the enrollment. The recovery flows make zero LinkedIn API calls.

Why are my campaign stats showing zero accepts when I have replies?

Replies imply acceptance — you can't reply to a message unless you accepted the invite first. Two issues caused this. Issue 1 (fixed late April 2026): a fast-reply race where prospects accepted and replied very quickly; the old code skipped the acceptance timestamp because the row had already advanced past Invited. Fix: split the timestamp stamp from the status flip so even a fast-reply row gets its acceptance recorded for the dashboard. Issue 2 (fixed late April 2026): some analytics surfaces (the 24h freshness banner on LinkedIn → Accounts, per-account analytics roll-up) read a different event store from the campaign counter. After the engine consolidation, unified-engine campaigns wrote acceptance events to the campaign store but never mirrored to the account-level store, so the banner showed 'no accepts in 24h' even when accepts were flowing. Fix: idempotent paired insert from the canonical helper covers both stores. The campaign-card Accepted/Replied counters and the LinkedIn Accounts banner now show consistent numbers. Hard-refresh your dashboard if you still see the issue (60s cache); contact support if accept rate is 0% with replies present after the deploy date.

I see a 'Template syntax invalid' error — what do I do?

Your campaign's message template has a Liquid syntax error — most commonly a typo in a merge tag like {{company} (one closing brace instead of two). Liquid requires EXACTLY two opening braces and two closing braces around every variable: {{firstName}}, {{company}}, {{custom.subject_line}}. Before late-April 2026, this triggered an infinite retry loop — one early customer campaign had 28 follow-up jobs retrying continuously with the same '{{company}' typo until we shipped the dead-letter fix. After the fix: the engine detects the parse-error on the first attempt; the send job is marked Failed with a template-syntax-error classification; the enrollment is parked as Pending Template Fix so the orphan reconciler does not recreate the job. To fix: open the affected campaign, find every merge-tag reference and verify each has exactly TWO opening braces and TWO closing braces (common typos: {{firstName}, {firstName}}, { {firstName}}, {{firstName | default: 'there'}). Save and click Resume — affected prospects retry on the next campaign tick. No prospects are lost. No LinkedIn API calls were made on the failed attempts (the parse error fires before the LinkedIn call), so no rate-limit cost to retrying. Click Preview in the editor to see the exact line number of the parse error.

Why is my account counter different from what the campaign shows?

If LinkedIn → Accounts shows 'invites sent today: 1' but you can see 24 messages went out per the campaign's activity log, you're hitting a counter desync, not a real send failure. Every message did go out; the account-level dashboard tile is just under-reporting unified-engine sends. Why (late-April 2026): there are two campaign engines — a standalone engine and a unified multichannel engine. Both call the same shared counter for weekly rate-limit gating (always correct, load-bearing for safety, never under-reports), but the daily-bucket tiles were written by a separate post-success increment that the unified engine forgot to wire on some action sites. Sources of truth: the weekly counter (drives rate-limit gating) is always correct; the campaign-card daily counter is always correct; the account-card daily counter under-reports for unified-engine campaigns until the fix is deployed. To verify messages went out: open the campaign card and check the per-step activity counter (ground-truth); open the LinkedIn inbox and confirm the messages are visible; check the last-messaged timestamp on the prospect. The fix audits every unified-engine action site and adds the paired daily-counter increment in the same transaction; a one-shot backfill recomputes the daily buckets from event rows. One customer's dashboard showed 1 message sent on the morning of the fix day even though 24 messages had legitimately gone out — every send was real, every safety gate held, the counter just lagged. Contact support if counters still mismatch after the fix lands.

I fixed my billing but my warmup is still paused — what should I do?

When a renewal payment doesn't go through, WarmySender pauses warmup on your mailboxes. This is a deliberate safety pause — we never warm a mailbox without an active plan behind it, because warming an inbox you're no longer paying for can hurt your sender reputation rather than help it. The same rule applies across all four pillars of the platform: cold email campaigns, email warmup, LinkedIn outreach, and multichannel sequences all wait for an active plan before they run. Once your payment clears and your subscription is active again, warmup resumes automatically within a few minutes — you don't need to restart anything, and your earlier warmup progress is preserved, so your mailboxes pick up where they left off instead of starting the ramp over from day one. To clear the pause: update your card under Billing › Payment Method, confirm the payment goes through, and give it a few minutes. Prefer not to wait, or want to switch it back on yourself? Open the Warmup page and toggle each affected mailbox back on manually — it takes effect immediately and your warmup progress is still kept. If a mailbox stays paused well after your payment has cleared, open its per-mailbox detail page to read the current pause reason, or contact us at [email protected].