Skip to main content

πŸš€ High-volume sending in WordPress, what mailer are you using (API)? SMTP is way too slow for me.

Hi everyone,
I’m looking for advice from people who send large email lists (10k+) through FluentCRM.

Right now I’m sending through SMTP2GO (SMTP) and I’m running into a major bottleneck:
Sending takes 2–3 seconds per email
A broadcast to ~10,000 subscribers takes hours

We reviewed my logs and noticed the delay is coming from wp_mail()

SMTP2GO also confirmed there is no throttling on their side, but that WordPress + SMTP is not suitable for high-volume sending.

Both FunnelKit and SMTP2GO recommend switching to an API-based mailer (Amazon SES, Postmark, Mailersend, etc.).

I’m considering Amazon SES, but I’ve heard mixed things:

πŸ‘‰ SES is extremely fast and cheap,
BUT

πŸ‘‰ deliverability can be tricky,

πŸ‘‰ and once emails end up on the SES suppression list, it can be a challenge to get them removed or reclassified.

I’d prefer to avoid deliverability headaches if possible.
So my questions for those of you sending big lists:

1.⁠ ⁠Which API mailer are you using successfully with FluentCRM?
SES?
Postmark?
Mailersend?
Another service?

2.⁠ ⁠How is your deliverability with that provider?
Especially compared to SES.

3.⁠ ⁠Any specific settings/tweaks you recommend for:
queue worker
cron setup
batch size
or API rate limits
… to improve performance?

4.⁠ ⁠If you’ve used Amazon SES:
Did you encounter any issues with suppressions/spam listings, and how easy was it to manage?

Thanks so much in advance! πŸ™ I’d love to hear what’s working best in the real world, especially for high-volume WordPress senders πŸ˜‰

Kevin Heinrichs

I use Amazon SES and Iam really happy with it.
+40.000 emails goes really fast (it costs only 4$) and I had never deliverabilityΒ issues (gmail, yahoo, web, gmx, icloud, etc.) without to have a dedicated IP, its just important you have everything set correctly like SPF, DKIM, DMARC etc. and you dont spam or have spam content inside of your emails. About SES suppression list, you can disable it and let manage FluentCRM for it with Amazon SNS.

Shahjahan Jewel

Today, we are sending almost 100K BFCM emails with FluentCRM + Amazon SES.

Israel Smith

Does FluentSMTP use API sending with providers like Amazon SES, ElasticEmail, or SMTP2Go? Or is there some other better way to setup API sending from FluentCRM please? I'm about to embark on this setup and want to get it right for my wife's business. Thanks πŸ˜ƒβ€οΈπŸ™

Eduardo Sachs

Hello everyone,

I’ve been following this thread closely, and honestly, I’m tired of seeing the same standard responses blaming SMTP providers or Cron configurations. I spent days "fighting" with FluentCRM support over this exact issue, and I need to expose what’s really happening to save you all some time.

I run a "beast" of a dedicated server (128GB RAM, 16 CPU Cores, NVMe, 30 public IPs) and use Elastic Email via FluentSMTP. Theoretically, I should be flying. In practice? My sending was choked at ~200 emails per minute.

For a long time, support kept telling me to increase PHP max_execution_time, check the server Cron, or blame SMTP latency. Total BS.

The truth that support hides (until you back them into a corner, like I did) is that FluentCRM has HARDCODED LIMITERS.

The issue isn't the SMTP protocol or API. The issue is that the plugin was designed to cap the amount of data it fetches from the database at a timeβ€”probably to protect cheap shared hostingβ€”but this kills anyone with professional infrastructure who needs to scale.

After I audited the code myself and proved it to them, support finally admitted it and gave me the list of files where these "handbrakes" are hidden.

If you want real speed (above 10k/hour), forget about switching SMTPs for a moment. The bottleneck is HERE, inside the plugin folder:

  1. Slow Automations:

In /wp-content/plugins/fluent-crm/app/Services/Funnel/FunnelProcessor.php, there is a line with ->limit(200). The plugin only processes 200 contacts per automation cycle, no matter if your server can handle 10,000.

I made this change:

$jobs = FunnelSubscriber::whereIn('status', $statuses)
->whereHas('funnel', function ($q) {
return $q->where('status', 'published');
})
->where('next_execution_time', '<=', current_time('mysql'))
->whereNotNull('next_execution_time')
->orderBy('next_execution_time', 'ASC')
->limit(6000)// Increased to process 6000 records at a time
->get();

  1. Bulk Actions:

In /wp-content/plugins/fluent-crm/app/Http/Controllers/SubscriberController.php, there is a ->limit(400). Trying to tag 50k people? Sit down and wait, because it’s going 400 by 400.

I made this change:

$subscribersModel = $subscribersModel->select(['id'])
->limit(3000) // Increased the batch size
->where('id', '>', $lastId)
->get();

  1. Email Sequences:

In /wp-content/plugins/fluentcampaign-pro/app/Hooks/Handlers/EmailScheduleHandler.php, the query for next sends is done via SequenceTracker::ofNextTrackers()->limit(XXX). The default limit is extremely low. I had to force change the code to ->limit(1000), otherwise it spoon-feeds the queue and the sending never finishes.

I made this change:

$processTrackers = SequenceTracker::ofNextTrackers()->limit(1000)->get();

What makes me angry:

They know this. In my ticket, after I sent a video proving my hardware was idling while the plugin was "sleeping", the developer (Masiur) finally said: "You can adjust the values in these files to increase volume, but we don't support that."

In other words, they sell a marketing automation tool but hide the fact that it comes "crippled" out of the box. I had to manually edit the plugin core (which is terrible for future updates) just to utilize my server’s power.

So, answering the OP: Amazon SES is great, use the API. But if you don't change these internal limits in the FluentCRM code, you could hire a NASA server and the sending will still be slow.

Honestly, I don't know if I caught all the throttles, as the code operates like a "black box" that the team refuses to document for the community. I still notice slowness in other areas, and I know the standard answer will be to blame my server, but tests prove the software is the brake.

You need to IMMEDIATELY document all these hidden limitations (hard limits) scattered throughout the codeβ€”whether in flows, timeouts, or processing batches (contacts processed per minute). Selling an "unlimited" tool that comes throttled out of the box is shameful.

Be warned: stop blaming the SMTP before looking at how the plugin queries the database or hands off emails to the SMTP.

As I was writing this reply, my wife asked me why I was banging on the keyboard so hard.

I hope Shahjahan JewelΒ reads this.

Best regards.

Israel Smith

Eduardo SachsΒ wow thanks so much for this! And I can totally feel the frustration through your words! I’ll definitely be getting my AI coding buddy Claude todo an audit of the code base looking for those limits. This kind of makes sense as I’ve been experiencing something similar with FluentForms and webhook timeouts. I guess the only real issue is re-coding these limits every time the plugin updates…?

Eduardo Sachs

Israel SmithΒ Yes, exactly! That is currently the biggest pain pointβ€”every time you update the plugin, it overwrites the changes, and you have to apply the patches again.

Regarding FluentForms: I don't use it personally, so I haven't audited that code. But since it is the same development team, I wouldn't be surprised at all if they use the same logic (hardcoded limits) there too. It seems to be their standard way of "optimizing" for shared hosting.

LOL

Israel Smith

Eduardo SachsΒ 

Shahjahan JewelΒ is there a good reason why those operational limit parameters are hardcoded within the plugin, and not moved out to a separate persistent config file, similar to how Wordpress works with wp-config.ini? I feel like that would be maybe an hour of work overall? And the defaults would still be suitable for shared hosting, but could easily and persistently be optimised for anyone running a beast server like Eduardo?