Why is my campaign paused with reason "subscription_inactive"

What this page covers

If you opened a campaign and saw an amber banner saying "Paused — subscription inactive" with an "Update payment method" CTA, this guide explains what that pause reason means, why it fires, the new V11 seat-aware guard that keeps LinkedIn campaigns running through short past_due windows on the email-side subscription, the 60-second auto-resume sweeper that reactivates campaigns when payment clears, multi-workspace handling, and what to do if a campaign stays paused after you've updated your card.

WarmySender is a 4-pillar outreach platform — Cold Emailing, Email Warmup, LinkedIn Outreach, and Multichannel sequences. This page covers billing-driven pause/resume across all four pillars.

What "subscription_inactive" actually means

WarmySender pauses campaigns when the workspace's subscription state on Stripe is anything other than active or trialing. The most common trigger is a card decline (your Stripe subscription flips to past_due after a failed renewal charge), but the pause reason also fires for canceled, unpaid, incomplete, and incomplete_expired states.

Why we pause: every active campaign costs platform resources (worker CPU, scheduler ticks, database writes, and outbound email/LinkedIn API calls). When your subscription isn't paying for those resources, we don't want to keep consuming them — both as a fairness measure across customers and to give you a clear signal that something needs your attention. The pause is reversible: campaigns retain every prospect's exact step state, so when payment clears the campaign picks up exactly where it left off.

The pause is logged with reason subscription_inactive in the campaign's audit trail. The campaign card shows a paused pill, the campaign detail page shows the amber banner with the "Update payment method" CTA, and the sending workers stop dispatching new actions for the campaign until the subscription state recovers.

V11 seat-aware guard — LinkedIn campaigns keep running

Before V11, the subscription guard pause fired uniformly across every campaign in the workspace — including LinkedIn campaigns on workspaces that pay for LinkedIn seats independently of the main subscription. Customers told us this was wrong: their Growth subscription went past_due over a brief card-rotation window, and their LinkedIn campaigns paused even though the LinkedIn seat invoice was paid on time and the seat itself was active.

The V11 fix (May 6, 2026) makes the guard seat-aware. Now:

The seat-aware guard means a Growth plan card-decline doesn't false-pause your LinkedIn outreach. Your LinkedIn campaigns continue firing within their per-account caps and ramp schedule while you sort out the email-side billing.

The 60-second auto-resume sweeper

Once you update your payment method on the billing portal, Stripe issues a webhook to our server confirming the subscription is back to active. Our webhook handler immediately resumes any subscription_inactive-paused campaigns in the affected workspace.

But Stripe webhooks aren't 100% reliable — network blips, transient receiver errors, and rare delivery failures happen. Pre-V11, a missed webhook meant your campaign stayed paused indefinitely until you noticed and clicked Resume manually. Post-V11, a new background sweeper runs every 60 seconds that:

  1. Selects every campaign in the entire platform paused with reason subscription_inactive.
  2. For each one, re-checks the workspace's current Stripe subscription state and seat status.
  3. If the subscription is now active or trialing, OR if the workspace has at least one active LinkedIn seat (for LinkedIn-only campaigns under V11's seat-aware guard), the sweeper auto-resumes the campaign.
  4. Logs an audit row with kind auto_resume_subscription_recovered so you and our ops team can see exactly when and why the resume fired.

Net result: even if the webhook misses entirely, your campaign resumes within 60 seconds of the next sweeper tick after payment clears. There's no "stuck for hours" failure mode.

Multi-workspace handling

Pre-V11, our resume helper had a subtle bug: it only checked one workspace per account owner — typically the most recently created. Owners with multiple workspaces (consultants running campaigns for several clients, agencies with workspace-per-account, customers who created a fresh workspace then forgot the old one) sometimes had older workspaces left paused even when the newer one was running.

The V11 fix iterates every workspace owned by the user when running the auto-resume sweeper. So if you have 4 workspaces and your subscription was paused on December 16, 2025 (real example: the usmantechzot@gmail.com cohort), all 4 of your workspaces' subscription_inactive-paused campaigns are checked and resumed in one pass.

The sweeper is workspace-scoped at every step — it never resumes a campaign across workspace boundaries, never mixes one user's billing state into another's, and respects every workspace's individual seat configuration. The fix is purely about completeness (don't miss a workspace), not scope expansion.

Worked example

Dipti's account has both a Growth subscription (which pays for the email pillar) and an active LinkedIn seat (which pays for the LinkedIn pillar). On May 4, her renewal card declined, Stripe flipped the Growth subscription to past_due, and our subscription guard fired.

Pre-V11 behavior: All 3 of Dipti's campaigns (CMO LinkedIn, CTO LinkedIn, Sales Director Email) paused with reason subscription_inactive, even though her LinkedIn seat was paid up and active. Net: her LinkedIn outreach stalled because of an email-side billing event.

Post-V11 behavior: The CMO and CTO LinkedIn campaigns continue running — the seat-aware guard sees an active LinkedIn seat and lets the LinkedIn-only campaigns through. The Sales Director Email campaign pauses (correct: that one depends on the email-side subscription), with the amber banner showing "Paused — subscription inactive" and an "Update payment method" CTA.

Dipti opens the billing portal, updates her card, and Stripe issues the customer.subscription.updated webhook. Our webhook handler immediately resumes the Sales Director Email campaign. (If for any reason the webhook is delayed, the 60-second auto-resume sweeper picks up the resume on the next tick after Stripe's state flips back to active — never more than 60 seconds late.) An audit row with kind auto_resume_subscription_recovered is logged so Dipti can see the resume in her campaign's audit trail.

Dipti's CMO and CTO campaigns never stopped. Her Sales Director Email campaign resumes within 60 seconds of payment success. Total customer-visible downtime: under a minute on the email side, zero on LinkedIn.

What to do if a campaign stays paused

If you've updated your payment method but a campaign is still paused with reason subscription_inactive after a few minutes, work through these steps in order:

  1. Hard-refresh your dashboard. Browser caches sometimes show a stale state. Cmd-Shift-R / Ctrl-F5 forces the page to re-fetch.
  2. Verify your subscription state on Stripe. Open the billing portal. The current state should show active. If it still shows past_due, the new card may have failed too — check your email for a Stripe failure notification, fix the card, and try again. Some banks block first-attempt SaaS renewal charges; a second attempt often succeeds.
  3. Check whether the campaign is multichannel or email-only. If it's a LinkedIn-only campaign and your workspace has an active LinkedIn seat, the seat-aware guard should have kept it running through the past_due window — the resume on subscription clear is a no-op. If the campaign is showing as paused even with an active seat, click "Manual resume" on the banner and reply to hello@warmysender.com with the campaign name so we can pull the audit row.
  4. Wait 60 seconds and refresh. The auto-resume sweeper runs every 60 seconds and will pick up the resume on its next tick after the Stripe state flips back to active. Worst case, you wait one full minute.
  5. Click "Manual resume" on the campaign detail page banner. If the auto-resume sweeper has somehow missed your campaign (rare), the manual resume CTA on the amber banner triggers a one-shot resume immediately. The campaign's prospects retain their exact step state and continue on the next sending window.
  6. Contact support. If after all of the above the campaign is still paused, email hello@warmysender.com with the campaign name. We can pull the audit log and confirm whether the issue is on the platform side (something we should fix) or a Stripe-side state we need to reconcile.

Account safety

The pause/resume cycle is purely a scheduler-state operation. Zero LinkedIn or email API calls fire during the pause/resume itself. When the campaign resumes, sending picks up at the next valid sending window — no burst, no catch-up replay of "missed" sends. Per CLAUDE.md "account safety always wins" — even if you were paused for 6 days during a billing dispute, we don't catch up to "what should have been sent" by firing 6 days of volume on resume. The campaign resumes at its normal pace, respecting per-account daily and weekly LinkedIn caps and ramp, plus per-mailbox daily limits and warmup state.

For LinkedIn campaigns specifically, the auto-resume sweeper does not trigger any LinkedIn API calls. The resume is a pure DB-state flip. Zero new LinkedIn calls in any of the V11 billing-side fixes preserves the safety-mode budget for legitimate LinkedIn outreach.

Common questions

Will I lose any prospects or sequence state during the pause?

No. Every prospect retains its exact step index, scheduled-next-action timestamp, and historical event trail. When the campaign resumes, the prospect picks up from the exact step it was on. No prospect is re-enrolled, no step is replayed, and no analytics are reset.

Will my LinkedIn account safety be affected?

No. Per-account daily and weekly LinkedIn caps and ramp schedule are unchanged through the pause. On resume, the campaign starts firing again at the normal cadence, gated by the per-account ramp and the per-campaign cap split (default 80/80/5). There's no "make up for lost time" burst.

My LinkedIn seat is active but my LinkedIn campaign still paused — what's wrong?

Probably one of: (a) your campaign is multichannel (has email steps in addition to LinkedIn) — those pause when the email-side subscription is past_due, by design; (b) your LinkedIn seat is showing as active on the dashboard but actually expired or canceled in Stripe (rare desync) — re-open billing, check the seat invoice; (c) a real bug we should know about — email hello@warmysender.com with the campaign name and we'll pull the audit row to confirm which path fired the pause.

How do I know which campaigns paused?

The campaign list in your dashboard shows a "Paused" pill on every paused campaign with the pause reason in tooltip-on-hover. Filter the list by status=Paused to see all of them at once. The campaign detail page shows the amber banner with the full reason string ("Paused — subscription inactive") and the "Update payment method" CTA.

Does the pause affect email warmup?

No. Email warmup runs on a separate scheduler and is not paused by subscription_inactive. Your mailboxes continue receiving and sending warmup emails during the pause, so your sender reputation is preserved. When campaigns resume, your mailboxes are still warmed up and ready to send at full deliverability.

What if I want to keep a campaign paused even after billing clears?

The auto-resume sweeper only resumes campaigns paused with reason subscription_inactive. If you've manually paused a campaign for any other reason (e.g., editing the sequence, fixing a template, intentional throttling), the manual pause flag is preserved and the auto-resume sweeper ignores it. To keep a campaign paused indefinitely after billing clears, click "Pause" on the campaign card before paying — the manual pause overrides any auto-resume.

Why does WarmySender pause campaigns at all instead of just sending less?

Because "send less" without an explicit signal to the customer leaves them confused — they'd see partial sends and think the platform was broken. Pausing is the clearest possible signal: a single pill on the campaign card, an amber banner with a CTA, and a precise pause reason. It also stops every per-action cost (worker time, API calls, scheduler ticks) cleanly, which lets the platform allocate resources to paying workspaces fairly.

Does the auto-resume sweeper ever resume campaigns it shouldn't?

No. Every resume runs through the same V11 seat-aware guard logic that the original pause used — same code path, same checks. If the subscription is still past_due or there's no active seat for a LinkedIn-only campaign, the sweeper passes the campaign through without resuming. The sweeper is safe-by-construction: it can only resume campaigns where the guard logic agrees they should be running.

Still have questions? Email hello@warmysender.com with the campaign name and a screenshot of the paused banner — we'll pull the audit log and confirm exactly when the pause fired and what's needed to resume.