Why no InMails sent — credits exhausted
What this page covers
If your LinkedIn campaign uses InMail steps and you noticed a sudden drop in InMail dispatch — or a campaign-events log full of Skipped: account InMail credits exhausted entries — this guide explains what happened, why WarmySender stops dispatching to a Sales Navigator account when its credit balance reaches zero, how the monthly reset cycle works, and what you can do to resume sending.
WarmySender is a 4-pillar outreach platform — Cold Emailing, Email Warmup, LinkedIn Outreach, and Multichannel sequences. This page is part of the LinkedIn Outreach pillar and applies specifically to the InMail action type (Sales Navigator + LinkedIn Premium accounts).
What happened (plain language)
LinkedIn Sales Navigator gives every paying account a monthly InMail credit balance — typically 50 credits per month for Sales Nav Core, more for higher tiers. When the balance reaches zero, LinkedIn returns a clean "Not enough credits" error on every InMail send attempt; the message simply does not leave your account.
Pre-V15 (before May 7, 2026), WarmySender would handle this on a per-prospect basis: each individual InMail attempt got the credit-exhausted error, the engine recorded the skip, and the next prospect on the same account immediately tried another InMail — into the same empty bucket. Result: hundreds of wasted LinkedIn API calls per day on an account that mathematically could not send anything until the next monthly reset.
V15 introduced an account-level circuit breaker. The first time a credit-exhausted error fires on a Sales Navigator account, WarmySender stamps the account row with the breaker timestamp. From that point until the next monthly reset (or a manual top-up), every subsequent InMail dispatch on that account is skipped at the pre-dispatch gate — before any LinkedIn API call is made.
This is a refusal-to-send pattern: it cannot cause a duplicate send, bypass a cap, or flip an account state. It saves LinkedIn API quota, prevents log noise, and surfaces the actual cause to operators in dashboards instead of burying it under per-prospect skip noise.
How the breaker works
When the breaker arms
The very first time WarmySender attempts to send an InMail through a Sales Navigator account and LinkedIn returns a message containing the substring "credit" (the LinkedIn copy is Not enough credits — Provider cannot execute request because of insufficient credits), the breaker arms by stamping the column linkedin_accounts.inmail_credits_exhausted_at = NOW().
The structured production log emits a JSON line of the form {"source":"inmail_credit_breaker","action":"set","account_id":"...","prospect_id":"...","ts":"..."} for grep-ability and dashboard ingestion.
When the breaker is consulted
Every subsequent InMail dispatch on the same account checks the breaker BEFORE calling LinkedIn. The decision tree:
- Stamp is NULL → proceed normally.
- Stamp is in the current calendar month → skip with reason
account_inmail_credits_exhausted, defer the prospect's enrollment to first-of-next-month (the typical Sales Nav reset boundary), record alinkedin_skippedcampaign event for audit. No LinkedIn API call. - Stamp is older than the current calendar month → auto-clear (Sales Nav credits should have reset on the 1st), proceed with the dispatch.
- Recent successful InMail evidence on the same account in the last hour (a
linkedin_events.event_type='inmail_sent'row exists with a non-empty chatId) → auto-clear (credits topped up), proceed with the dispatch.
What the breaker does NOT pause
The breaker is InMail-specific. The same account continues to send connection invites, messages, profile views, and engagement actions at full normal pace — those don't consume Sales Nav credits. Pausing them would over-restrict and waste capacity.
The Sales Nav monthly credit cycle
LinkedIn Sales Navigator credits reset on the first of each calendar month at midnight UTC. The reset is automatic — you don't need to do anything. Here's the typical cycle:
- Day 1, 00:00 UTC: Your monthly InMail credit allowance is replenished by LinkedIn. For Sales Nav Core, this is typically 50 credits.
- Throughout the month: Each successful InMail send (whether the recipient replies or not) consumes 1 credit. Failed sends (recipient blocked you, profile deleted, etc.) generally do NOT consume a credit, but check your LinkedIn billing page for exact rules.
- End of month: Unused credits roll over to the next month up to a tier-specific cap. For Sales Nav Core, the cap is typically 150 credits total (you cannot accumulate more than 3 months' worth).
- If you hit zero mid-month: The account simply stops sending InMails until the next reset. No degraded-performance mode; no "low priority" sends; just zero throughput on that action type until reset.
WarmySender's breaker auto-clears on the calendar-month rollover, so dispatch resumes naturally on the 1st without operator intervention. If you top up your credits mid-month (LinkedIn allows this on most tiers) and then send any successful InMail through the account in the next hour, the breaker also auto-clears via the recent-success evidence path.
What to do as a customer
You have three options when an account hits the credit-exhausted state:
Option 1 — Wait for the monthly reset (zero-cost)
- Confirm the breaker is armed: in the LinkedIn Accounts page, the affected account shows a "Sales Nav credits exhausted — auto-resumes next month" pill on the account card.
- Continue running your campaign. Connection invites and messages on the same account keep flowing.
- On the 1st of next month at 00:00 UTC, the breaker auto-clears and InMail dispatch resumes.
- Affected prospects whose enrollment was deferred to first-of-next-month re-enter the dispatch path automatically — no manual re-enrollment needed.
Option 2 — Top up credits via LinkedIn (mid-month resume)
- Log into LinkedIn directly (not through WarmySender — credit purchases happen on LinkedIn's billing page).
- Open Sales Navigator → Settings → Billing. Find the "Buy more InMail credits" option (LinkedIn's UI labels vary by region and tier).
- Purchase the credit pack appropriate to your campaign volume.
- Send a single test InMail through WarmySender — pick any small campaign and trigger one dispatch. If it succeeds, the breaker auto-clears on the next dispatch on the same account (recent-success evidence path).
- Alternatively, manually clear the breaker via the LinkedIn Accounts page → account card → "Reset credit-exhausted state" button (operator-only; contact support if you don't see it).
Option 3 — Switch to a different action type for the affected campaigns
- Edit the campaign step that's hitting credits-exhausted.
- Change the action from
send_inmailtosend_message(only works for already-connected prospects) or remove the InMail step entirely. - Save the campaign. Affected prospects re-enter the dispatch path on the next sending window.
- Note:
send_messagerequires a 1st-degree connection. If your campaign was using InMail specifically because the prospects are not connected, this option doesn't apply — wait for the reset or top up.
How to recognize this state in the dashboard
Three signals make the credit-exhausted state diagnosable at a glance:
- Account card pill: The LinkedIn Accounts page shows a "Sales Nav credits exhausted — auto-resumes [date]" pill on affected accounts.
- Campaign event log: The campaign detail page shows
linkedin_skippedevents with reasonaccount_inmail_credits_exhausted(vs the per-prospectinmail_eligibilityreason that fires for open-profile / blocked / ineligible recipients). - Production log: Operators can grep production logs for
"source":"inmail_credit_breaker"to see arm/clear/skip events with timestamps. Useful for support cases.
Account safety
Per CLAUDE.md, account safety is the top invariant of the WarmySender platform. The credit-exhausted breaker is strictly safety-improving:
- It cannot cause a duplicate send. The breaker only refuses to dispatch; it never records a phantom send or stamps a counter.
- It cannot bypass a cap. When the breaker auto-clears at month rollover, the next dispatch flows through every existing safety machinery — daily caps, weekly invite limits, ramp schedule, per-account cooldown, sending window, prospect cooldown.
- It cannot flip an account state. Account status remains "Connected" throughout — only the InMail action type is paused. Invites, messages, view-profile, and engagement actions continue at full normal pace.
- It saves LinkedIn API quota. Pre-V15, an account at zero credits would burn ~1 LinkedIn API call per hour during business hours on doomed dispatches. The breaker eliminates that waste, leaving headroom for the platform's temporary-safety-mode circuit breaker.
Related documentation
- LinkedIn rate limits and ramp schedule — covers the per-account daily/weekly limits that apply on top of the credit budget.
- Why my LinkedIn account shows Connected but is not sending — covers the V15 split-state fix; orthogonal to credits-exhausted but a related diagnostic path.
- Why a connection accept is missed — for the matcher / bridge-miss family of issues that's a different root cause than credits-exhausted.
- What is a late accept — the V12 SAFE-design behavior for accepts arriving after a wait_accept timeout.
Frequently asked questions
Does WarmySender consume my Sales Nav credits?
No — every successful InMail consumes exactly one of YOUR Sales Nav credits, billed by LinkedIn directly. WarmySender does not have its own credit pool. Your account, your credits, your cycle.
When exactly does the breaker auto-clear?
Two conditions auto-clear:
- Calendar-month boundary: If the breaker stamp is older than
date_trunc('month', NOW())at the next dispatch attempt, the breaker auto-clears asmonthly_reset. Practically: armed on May 24 → auto-clears on the first dispatch attempt on June 1 or later. - Recent successful InMail evidence: If a
linkedin_events.event_type='inmail_sent'row with a non-empty chatId exists on the same account in the last hour AND was created after the breaker stamp, the breaker auto-clears asrecent_success_evidence. Practically: top up credits, send a single test InMail through WarmySender, and the breaker clears on the next dispatch.
Why doesn't the breaker pause invites and messages too?
Sales Nav credits only apply to InMails. Connection invites and messages on connected prospects don't consume credits — they're billed separately as part of the platform subscription. Pausing all action types would over-restrict and waste healthy capacity.
My affected prospects were deferred to first-of-next-month — what does that mean for my campaign timeline?
The deferred prospects don't fail or stop — they simply re-enter the dispatch path on the 1st. Your campaign continues to send connection invites + messages (which don't consume credits) at normal pace through the rest of the month. On the 1st, deferred InMail-step prospects start dispatching again, subject to the standard daily cap + ramp + cooldown machinery.
Can I see exactly when the breaker armed and cleared?
Yes — operators can run this SQL against the LinkedIn Accounts table:
SELECT id, display_name, status, inmail_credits_exhausted_at
FROM linkedin_accounts
WHERE inmail_credits_exhausted_at IS NOT NULL
ORDER BY inmail_credits_exhausted_at DESC;
For arm/clear/skip telemetry over time, grep the production logs for "source":"inmail_credit_breaker".
What if I'm on LinkedIn Premium (not Sales Navigator)?
LinkedIn Premium accounts have a different InMail credit model (typically 5/month for Premium Career, 15/month for Premium Business). The same credit-exhausted error fires when those run out, and the same breaker arms on the same account row. The auto-clear behavior is identical — credits reset on the 1st of each month.