Skip to main content

After upgrading to 3.1.0, sending large campaigns became extremely slow on my setup. A campaign to ~28,000 subscribers was taking many hours β€” in the worst case, spreading across days before finishing. Before the upgrade, the same kind of campaign finished in well under an hour. Same server, same SMTP (Elastic Email, EU), same configuration β€” only the plugin version changed.

Before posting publicly, I went through support. I want to be fair and share how that went:

Their first recommendation was the WP-CLI sender with multiple workers (unique option keys, staggered offsets) β€” which was exactly the setup I was already running β€” and then to ask my host (Cloudways) whether it supports persistent cron for unattended CLI workers. So the diagnosis essentially pointed at my hosting. A second reply confirmed they've escalated the 2.x-vs-3.x throughput difference and the connection-reuse question to their dev team, with no technical conclusion or ETA yet. I do appreciate the escalation.

But I needed a working system now, so I tested the one variable I hadn't: the version itself.

The numbers, measured directly:

  • On 3.1.0 β€” large campaigns sent at roughly 5–20 emails/min. Even with multiple CLI workers I could only reach ~40/min in short bursts, never sustained.
  • On 2.9.86 β€” the same ~25,000-subscriber campaign completed in 39 minutes, start to last email.

Here's the key point about the "it's your hosting" diagnosis: if the bottleneck were really my host or cron, the rollback wouldn't have changed anything β€” same machine, same cron, same SMTP. Yet the identical campaign went from days to 39 minutes. The only thing that changed was the plugin version. That rules out the host as the cause, at least for my case.

A few more findings from my testing, in case they help: CPU sat 79–88% idle during sends, EUβ†’EU latency to my ESP was ~0.05s, the provider accepted 100% of submissions, memory was never a constraint. On 3.1.0 I also saw hundreds of cURL error 28 (connection timeout) entries at high send rates β€” consistent with a new HTTPS connection being opened per email rather than reused. On 2.9.86, much less of that.

On multi-threading (the usual recommendation): I had it enabled on 3.1.0. On my Kubernetes-based host it would burst for a few minutes, then the background workers got reaped and it stalled β€” rows cycling between processing and pending. On 2.9.86 the same built-in multi-threading just runs cleanly through Action Scheduler, no manual workers needed.

I'll leave the conclusions to each user. For me: if you genuinely depend on this system for production work, 2.9.86 is the more reliable choice right now.

And to the developers β€” Shahjahan JewelΒ , with full and genuine respect for the enormous work that's gone into 3.x β€” I don't think it's quite ready for production-critical workloads while a regression this serious remains. I'm sure it runs well on many setups; mine clearly isn't one of them yet. Happy to share my full diagnostics (SQL, send-rate measurements, server load, cron logs) if it helps engineering pinpoint what changed in the 3.x sending path.

I've used incoming webhooks in the past to update existing contacts. After the FluentCRM 3.0 update, it looks like every incoming webhook has only one type for creating a new contact.

If I cannot update existing contacts with an incoming webhook, this creates a severe limitation for my workflows in n8n. Here's my example.

When a timer expires in a FluentCRM Automation, it sends an outbound webhook to n8n. Then n8n processes and returns a Pass or Fail value to FluentCRM via an incoming webhook.

I don't need to create a new contact, but that seems to be the only option. Why impose this limitation on how things communicate?

Is there an alternative I haven't considered? This sort of limitation is screwing up some client work I'm doing now. I appreciate any insight about this change and how to get around it.

Maybe I'm missing the way... Maybe you can shed some light... lol

Every time I create a campaign, I can choose an editor (honestly, I'd prefer to set one as default and avoid the unnecessary step).

As I don't choose any of them, I'm assigned to the default editor (blocks).

Then as I have my own template, I have to browse for my own favorite and simple template (every single time).

And as I said before, I'd prefer reduce the workflow clicking create new campaign and write down my text, not wasting my time (every single time) choosing an editor and browsing for my template.

I remember asking for this "feature" months (or maybe years) ago, and I think someone said it would be considered for next updates.

I started by saying "maybe I'm missing the way"... Maybe this was released, and I don't know how to do it (if this is the case, can you guide me to achieve a simple workflow for my needs?).

Thanks for helping me.

How can I set MY OWN template as default? How can I set MY OWN template as default? How can I set MY OWN template as default? How can I set MY OWN template as default?

I'm using FluentAuth for my registration, but a bot is signing up a new person every 10 minutes, each from a different IP address.

They don't get in, because I have enabled email confirmation, but I am worried about my email spam reputation. I am getting a lot of automatic email replies from the signup emails from corporate mailboxes.

I thought I could enable an invisible Recaptcha or something like that to further strengthen it against bots (don't want to make it harder for real people) but I don't see anywhere to do that.

TLDR: How can I make it harder for bots to try to register? (already have email confirmation required)

Shahjahan JewelΒ is it possible to add a 'create booking' button from the contact page that pre-fills contact fields for the booking?

Hi,

I have been receiving a fatal server error related to FluentCRM since May 23rd.

When the error occurs:

I am currently using FluentCart in Test Mode. The error happens when I make a test purchase using a test user account. This test purchase triggers a FluentCRM automation to send an email, and the fatal error occurs at the exact timing the automated email is dispatched.

Error Mail Details:

Error Type: E_ERROR (or E_COMPILE_ERROR)

Error Message: Cannot declare class FluentEmogComposerAutoloaderInit6ba88f1695515329cfc7e4b26033cc69, because the name is already in use

File: /home/igial/tokyobigaku.com/public_html/whp/wp-content/plugins/fluent-crm/app/Services/Libs/Emogrifier/scoped-vendor/composer/autoload_real.php:5

Could you please investigate this issue? It appears to be a class redeclaration conflict occurring during the automation process.

Environment:

  • FluentCRM Version: 3.1.0
  • FluentCart Version: 1.3.28Β 
  • WordPress Version: 6.9.4
  • PHP Version: 8.3.30

Thank you

RESOLVED: Smartlink was tested in "test email" but they don't work in test emails.

I created a FluentCRM smartlink to an event page that is governed by membership rules access. I am sending the email out through FluentCRM to the registered user. However, when I test the link to a test account, I get directed to the standard MP login page. I even turned off MP "Redirect unauthorized visitors to a specific URL" to see if that was the issue. Smartlink autologin is enabled.

Has anyone found a way to make this work? MP is inside my automation to create lists and tags.

UPDATE (June 2): I've resolved this for my setup by rolling back β€” full details in the comments below. Leaving the original post for context, since it seems others hit the same thing.

After upgrading to 3.0 / 3.1, sending large campaigns became extremely slow on my setup. A campaign to ~30,000 subscribers was taking days to finish, where before it took well under an hour.

My configuration: FluentSMTP, server-side cron correctly set, ample memory, and no changes whatsoever to the configuration β€” only the plugin version changed.

I did quite a bit of testing to rule things out (server, memory, SMTP, cron) before posting, and I'd be glad to share what I found. Has anyone else run into this after the 3.x upgrade, and found a path forward?

Right now, when we capture leads through Fluent Forms, the IP address can already be collected as part of the submission data (which is something Fluent Forms has supported for a long time).

In many legitimate operational and compliance-related scenarios where there is a valid legal basis, that IP can be used to determine approximate country or city information for the lead.

What always surprised me is that FluentCRM does not currently process or enrich that data automatically.

In our case, for workflows where it is legally justified and operationally necessary, we built our own automation layer:

  • capture IP from Fluent Forms,
  • verify it through a trusted service,
  • update the contact profile inside FluentCRM automatically.

So technically, yes, this can already be solved with custom workflows. And ours work reliably.

But honestly, it still feels like a patch for something that is extremely basic inside a modern CRM.

Having approximate location data is sometimes operationally necessary for:

  • determining whether a service can legally be provided,
  • shipping restrictions,
  • VAT/tax handling,
  • language segmentation,
  • timezone-based automations,
  • fraud prevention,
  • compliance-related workflows.

Most CRMs already handle this natively.

So my question is:
is native IP-based country/city enrichment part of the roadmap for FluentCRM v3 or future releases?

Even better:
having trusted geolocation providers integrated directly into FluentCRM would make this much more powerful and reliable.

Because right now, needing external automations for something so foundational feels a bit strange inside an otherwise very complete ecosystem.

And of course, the more services, jurisdictions, automations and edge cases you handle, the more operational obligations you have (and the more room there is for costly mistakes if these basics are not handled properly inside the CRM itself).

I created an automation that includes starting a 7 email sequence.

Later I apply a tag ("got-sequence") tag, but it applies it as soon as it sends email #1

How can I apply a tag only after the whole email sequence has been sent? I don't see anywhere in sequences to apply tags.

I may change the length of the email sequence, so adding a day delay won't be reliable.

Thanks in advance!