- Looking for another solution
- Preparing to switch to FluentCRM
- Making the switch
- FluentCRM wishlist
I first signed up for ActiveCampaign in December of 2015, so we’re coming up on our eight-year anniversary 🥲.
Having worked with Confusionsoft as a consultant for several years, ActiveCampaign in 2015 was like a breath of fresh air. You could go to the ActiveCampaign website and just sign up for a two-week trial. No phone call with a pushy sales rep. No opaque pricing, or multi-year contracts with early termination clauses. No mandatory “onboarding fees”.
They had a slider on their pricing page where you could see what features were available in the different plans, and how your monthly bill would change based on your list size.
Inside the app, you could drag and drop custom fields to change their order, build responsive web forms and emails, and the API was intuitive and well-documented, with developer support there if you needed it.
This was all revolutionary at the time.
The original version of WP Fusion, from February 2015, was built specifically for Infusionsoft. But after trying ActiveCampaign later that year, I could see where the future was going.
We spent three months at the end of 2015 rebuilding WP Fusion from the ground up so that it could connect to multiple CRMs, and when we launched 2.0 in March 2016, ActiveCampaign was the first new CRM we supported.
This is all to say— ActiveCampaign and I have had a long relationship.
#Like all relationships, it’s had its ups and downs
Support is a particular issue with ActiveCampaign. It’s not uncommon to wait for a week or two to get a reply. For issues that require the attention of engineering, that can stretch to many months.
In January of this year, I was assisting a WP Fusion customer with an easily reproducible bug whereby a contact could end up with the same tag applied twice. This was messing up automations since if the contact is tagged twice, they can also end up triggering the same automation twice (and receiving duplicate emails).
We sent the proof to AC support in January, it got escalated to engineering by March, and we had the bug confirmed and fixed by June 😞.
As another example, for the past two years, we’ve been experiencing regular API timeouts when loading contact data over the ActiveCampaign API. This can cause your checkout to spin for up to 15 seconds if an existing user logs in and their tags are loaded. Several customers reported it, but without a reliable way to reproduce it, they were told it was an issue with their website or hosting.
Finally, after setting up a “stress test” via a third party API testing site, we got a response from ActiveCampaign engineering that since the request was against the V1 API, not the newer V3 API, they can’t guarantee the performance of it, and they won’t look into fixing it (despite the docs saying they “fully support” the V1 API).
This was fine, we were able to make some changes to upgrade to the newer API, and now it’s working more reliably.
But this is after thousands of outages that affected hundreds of customers, causing emails not to send, coupons not to activate, courses not to unlock, and many other inconveniences that require manual intervention (and make WP Fusion look bad as an integration provider!) 😠
The ultimate effect of this is that you just stop contacting support. If something is broken, you find a workaround, or you live with it. It’s easier than trying to convince a tier-one agent that the problem isn’t with your browser.
#Still, ActiveCampaign mostly worked well
Out of all the platforms we support, ActiveCampaign has been one of the most reliable, and as long as you don’t need to contact support it’s mostly pleasant to work with.
Yes, some obvious enhancement requests (like being able to re-subscribe an unsubscribed contact via the API) have been ignored for many years. But I get it, it’s a big company, the pace of innovation is slow.
In short— I wasn’t thrilled with ActiveCampaign, but I still thought it was the best value platform in terms of features for the price.
#Until the price changes
In March of 2023 ActiveCampaign increased the price of all their plans, in many cases by 2x or more. We remained at the legacy rate of $60 / mo., as long as we stayed under our contact limit of 10,000 contacts. If we changed plans, we’d jump to the new price tier.
So for the rest of 2023 I took steps to keep our list size small— deleting unengaged contacts, removing the “Newsletter Signup” forms from our sites, merging duplicates, etc. But ultimately we couldn’t keep it down forever, and since August we haven’t been able to send any campaign emails at all until we upgrade 😞.
The next contact limit is 25,000 contacts, which would take our monthly bill from $60 per month to $229.
This is too hard to justify considering we only send a few campaign emails a year, the API frequently has issues, and support is mostly unavailable.
I would have probably stomached a 2x price increase, but 4x is too much 😞
#Looking for another solution
Since I spend my work day (and a lot of my free time too 🙈) experimenting with marketing automation tools, I have a pretty good sense of the landscape 😅
Without having a full-time content person on the team, it’s hard to justify switching to another cloud platform that’s priced based on list size. If we were sending out weekly newsletters the ROI would be more obvious, but at the moment we mostly use the CRM for consolidating customer information and running automations on single contacts (new customer onboarding, demo followup, etc.)
I briefly looked at Brevo, which is priced based on email sends, not list size. €49 / month would get us unlimited contacts, 20,000 email sends, and sales CRM features (i.e. viewing order data in the CRM) that we didn’t have access to on ActiveCampaign’s basic plan.
I’ve had a great experience working with their support in the context of WP Fusion, and they seem to be releasing new features quickly.
But I’m still nervous about switching to another cloud provider who could raise prices again at any time.
After our experience switching from HelpScout to FreeScout over the summer, I was feeling optimistic about our ability to self-host an email marketing tool.
Mautic is an obvious option, it’s self-hosted and open source like FreeScout. But the automation builder leaves a lot to be desired, the way tags are managed is confusing (tags are applied over the API, but emails can only be sent to “segments”, so each tag needs to be linked to a segment and set to update the segment via a cron job). As well, almost every time I update Mautic it breaks 😞.
So I started looking at WordPress plugins.
#Marketing automation via a plugin
There are definitely downsides to running your email marketing via a WordPress plugin:
- If it’s running on your main website, it’s sharing resources with the rest of your store (or course, membership, etc). If the site is slow, your CRM will be slow.
- It’s a relatively new product space and frequent updates can mean frequent bugs.
- WordPress itself can be vulnerable due to security issues in other plugins.
- Performance will never be as fast as a standalone web application, since all of WordPress needs to load with every request.
I really love Groundhogg and the team behind it 🧡. Groundhogg has been around since 2018, and they were the first serious plugin-based email marketing solution for WordPress.
Groundhogg on WordPress.org: 2,000 installs and 5 stars ⭐⭐⭐⭐⭐
In terms of the integration with WP Fusion, Groundhogg has always given us the fewest problems of any plugin-based CRM. It’s well-coded, stable, and has a bunch of addons that can customize it for almost any business requirement.
It also already supports Event Tracking, which we use heavily with ActiveCampaign.
But ultimately it’s so different from ActiveCampaign that it was going to complicate the transition. My goal with this move was to assign it to someone on our team to copy over all the contacts, fields, tags, email templates, and automations. So as much as possible we want a one-to-one replacement in terms of the product experience.
While getting used to calling automations “funnels”, and triggers “benchmarks” wouldn’t be so hard. There are some things in the Groundhogg funnel builder that don’t match up neatly.
For example we often use long-running automations with multiple branching conditions and “jump to” actions to personalize the email content for customers.
In Groundhogg each funnel is linear, with a single trigger, followed by multiple steps, until the funnel ends.
While I know on a technical level it’s possible to reproduce our ActiveCampaign automations in Groundhogg (via applying tags that trigger other funnels), it means we can’t spot check each automation and make sure it was copied over correctly. We also can’t compare conversion rates at various automation steps one-to-one, since our single automations would need to be broken into multiple funnels.
I also don’t love the Groundhogg UI 🤔
I think it’s cool to lean into the fact that it’s a WordPress plugin. But at the same time— WordPress already gives me a lot of stress 😅. I’d prefer not to be thinking about WordPress when I have my marketing hat on.
This also means some things are slower since each action (opening a contact, saving a record, editing a tag name, etc) requires a full browser refresh.
Still— if I were starting a new business, or building a site for a client, Groundhogg would probably be my first pick. It just didn’t work out for us because of how different it is from ActiveCampaign.
Groundhogg is regularly $360 / yr for the Plus package, but you can take 25% off for Black Friday / Cyber Monday.
We have many WP Fusion customers who are very enthusiastic about FunnelKit (aka FunnelKit Automations).
FunnelKit on WordPress.org: 20,000 installs and 5 stars ⭐⭐⭐⭐⭐
FunnelKit is the newest marketing automation plugin we looked at, and it has a lot of impressive features. The admin experience is also pretty familiar coming from ActiveCampaign.
Ultimately, I decided FunnelKit was just too new to be reliable (yet). There are a few reasons.
Can you please decide on a name? 😭
This might be petty, but it drives me nuts when companies or products re-brand.
In just four years this plugin has gone through the following name changes:
- WP Marketing Automations
Look at the plugin install screen below and tell me which one of these is the CRM and email automation tool, and which is a checkout flow builder for WooCommerce? 😵💫
This has caused a lot of stress for us with the WP Fusion integration with both plugins. In some cases it’s not clear which functionality resides in which plugin, or an update to one or the other in the wrong order will cause both to crash.
As recently as August 2023, FunnelKit changed their REST API endpoint from
autonami-app in a way that wasn’t backwards compatible, which caused the API integration to break for some of our customers.
To be fair— FunnelKit support is some of the best we’ve worked with, and they’ve often been proactive about reaching out to us in advance of potentially breaking changes.
When customers write in to WP Fusion with FunnelKit issues, we can cc their support and usually get a response the same day.
This is fantastic and I am super appreciative of it 🙏
But I wish things wouldn’t break in the first place.
So when I saw Daman Jeet post in their Facebook group around the beginning of October (when we were making this decision), saying that they were about to announce big news, my first thought was, “They’re going to change the name again! 😩”, and my second thought was that FunnelKit isn’t quite mature enough for us yet.
That leaves FluentCRM.
FluentCRM on WordPress.org: 30,000 installs and 5 stars ⭐⭐⭐⭐⭐
We’ve supported FluentCRM with WP Fusion since September 2020, so it’s a pretty well-tested integration.
Out of all the plugins we looked at, FluentCRM also had the most active installs, which makes me feel more secure in that bugs will be found and fixed faster than with a smaller plugin.
FluentCRM is very familiar coming from ActiveCampaign— it uses the same nomenclature of lists, tags, automations, triggers, and goals.
After testing it we found we could mostly copy over our existing ActiveCampaign processes one-to-one, and we could compare the same data points across platforms to make sure nothing had broken (i.e. has the open rate on our Free Download automation, email #2 changed significantly since the switch?).
And I really like how FluentCRM lets you hide the WordPress admin entirely when you’re working inside the CRM 🤓.
Get Automated. Get WP Fusion.
Deeply integrate multiple WordPress sites with FluentCRM using WP Fusion.Buy WP Fusion
#Preparing to switch to FluentCRM
So, how did we make the switch?
We sell two plugins, WP Fusion and Fatal Error Notify, and so it was important for me for the CRM to be on its own subdomain instead of running on both of those sites. This is also better for security, and gives us more control over server resources.
Thankfully WP Fusion makes it easy to connect to FluentCRM remotely over the REST API, so we were able to set up the CRM on a subdomain (at crm.verygoodplugins.com).
Currently that is running on a 4 GB / 2 core Digital Ocean droplet (via Cloudways). The server is separate from the WP Fusion server, but it is also hosting our support desk and some other test and backup sites. We may move FluentCRM to its own server if we need more resources (this is pretty easy to do).
We’re using Amazon SES for email sending, which we’d already set up when we moved to FreeScout over the summer. Our account allows for 50,000 emails per day at 14 emails per second, at a cost of $0.10 per 1000 emails (i.e. to email our whole list of 15,000 contacts, we’d pay about $1.50 🤑).
We are using Memcached, and Redis caching via the Object Cache Pro (provided free by Cloudways). After a lot of testing, it appears like disabling Redis actually results in the fastest API performance.
I like using the Insomnia app for basic API testing. Against our old ActiveCampaign account, updating a single contact and loading a single contact’s tags is averaging about 500ms per request.
With FluentCRM, updating a contact ranges from 250ms to 350ms, and loading a contact’s tags takes about 200ms to 300ms.
The performance is slightly better than ActiveCampaign for a single request 👍. However, that doesn’t account for simultaneous requests. If we’re running a big sale (or doing a big export), we need to make sure the CRM site can still handle all the incoming data without timing out.
For these tests I like to use Loader.io which lets you simulate multiple simultaneous connections, while measuring the response times and success rate.
Let’s start with an easy one. We’ll load 500 sequential contacts over the API in one minute.
The results are good! 👌
252ms average response time, consistent throughout the test 🎉.
As well, on the server, resource utilization is low (using
htop to monitor memory and CPU usage across the two cores).
Let’s try 1,000 contacts.
In this case the CPU and memory utilization both hit 100% pretty quickly and the requests started timing out ☠️
We should be happy with 500 API calls in a minute, but I wanted to dig into it a bit further 🤓. Looking at the resource allocation on the server I could see Varnish eating up almost all the memory during this test. Since Varnish is designed for page caching, and not really API caching, I turned it off.
At the suggestion of Cloudways support I also increased the MySQL max connections limit from 150 to 300, and then ran the test again.
It loaded all 1,000 contacts, with an average response time of ~700ms 🔥
The response time mostly stayed around 400-500ms but got as slow as 1,500ms when the number of active clients per second got over 30.
CPU usage crept up towards the high end, but the site didn’t go down.
There’s probably more optimization we can do here (and keep in mind this is on a very basic server), but I’m happy with the results— under normal usage FluentCRM is performing about 50% faster than the ActiveCampaign API 🔥
Let’s try one more test 👷
In the first test we were loading subscribers, which may be artificially fast due to Redis having previously cached some subscriber data.
In this test, let’s try tagging 500 contacts in one minute, since the POST requests won’t benefit from caching.
It also handles this without an issue ✅
500 contacts tagged in one minute with a 297ms average response time. Server resources healthy:
This is all to say— we don’t need to worry about a bunch of new customers or a big email send crashing our site. FluentCRM can easily handle 10+ API requests per second without timing out or running low on resources.
Another benefit of having the CRM on a subdomain is that we can make it much more secure than our public facing sites.
Rather than using a security plugin (which tend to be complex and require a lot of resources), I prefer to use Cloudflare.
With a free Cloudflare plan we can add a “challenge” page to any URL that contains
wp- in it, i.e.
And then we can add an exemption to that rule, to bypass the challenge for any traffic coming from one of our own sites.
In addition to the IP addresses, I’ve also added a cookie check for the
wordpress_logged_in cookie. This will bypass the Cloudflare challenge for anyone who is already logged in to WordPress.
I’ve also set security to “High” under Security » Settings.
Now any suspicious traffic or login attempts will be shown a challenge page where they need to complete a Captcha or puzzle to continue. Any requests from our own sites will bypass the security rule ✅.
#Making the switch
Moving from ActiveCampaign to FluentCRM involved several steps
- Moving the contacts
- Moving the automations and email templates
- and finally connecting the live sites to the new CRM
#Moving the contacts
This was the hardest part. FluentCRM includes an ActiveCampaign import tool but it was really slow, and it crashed a lot. We’d start an import on our list of 15k contacts, only to have it time out after a few hours, and we’d need to start over.
After a week or two of this, we gave up and tried to do a .csv import
At the moment, FluentCRM can’t import tags or lists from a .csv, so the only solution was to export each of our ~50 tags as separate .csvs, and import them one by one, assigning the correct tag to each import.
After another week of this it was clearly not an efficient use of time. I started to dig into why the ActiveCampaign importer was crashing and was thankfully able to fix it by switching from the V1 to the V3 ActiveCampaign API (FluentCRM was suffering from the same timeouts I complained about in the first section).
Once this was fixed, we were able to import all 15,000 contacts in about four minutes, including tags and fields 🔥
(FluentCRM were kind enough to merge our fix into the core plugin, so everyone else can benefit).
#Moving the emails and automations
You can’t export automations from ActiveCampaign but since the automation builders are so similar, we were able to go through them one by one and copy over each step.
For the email content we copied the raw HTML out of ActiveCampaign rather than rebuild them all in FluentCRM’s visual editor— we’ll do that as it comes up when we need to make edits.
One thing missing from FluentCRM was a Field Updated trigger, which we use quite a bit in ActiveCampaign. This lets us trigger emails based on changes in a customer’s license status, subscription status, etc., and it’s more efficient than syncing both a field and applying a tag like “License Activated”.
Thankfully FluentCRM is pretty extensible and we were able to build this ourselves. It’s available for free on our Github if anyone else wants to use it.
#Connecting the sites
Once everything was migrated, we reset WP Fusion on both sites, and connected to FluentCRM. WP Fusion worked through every user on the sites, loading their contact ID and tags from FluentCRM.
- Re-mapped our WordPress fields with FluentCRM fields in the WP Fusion settings.
- Configured our AffiliateWP tags.
- Set up the tags for our Easy Digital Downloads purchases and price variations.
- Set up the form feeds on Gravity Forms and Elementor Forms.
- Set up abandoned cart tracking.
Altogether this took about twenty minutes. Not bad ✅
There are some things we’re still missing from ActiveCampaign.
A big one was event tracking, which we use to see our history with a customer— when they logged in, when they contacted us, when they installed the latest WP Fusion update.
This is way more valuable to have as an activity feed than in tags or custom fields, since we can see the customer’s whole journey with us.
Thankfully this was also pretty easy to add to FluentCRM. It’s more of a proof of concept than anything, but it does work, and we’re able to track the events we need.
You can read more about that and download the plugin from the FluentCRM Events repository on our Github.
For information on tracking events with WP Fusion, check out the FluentCRM Event Tracking documentation.
Get Automated. Get WP Fusion.
Track events in FluentCRM in real time using WP Fusion.Buy WP Fusion
#Todo: Merging duplicate contacts
At the moment it isn’t possible to merge duplicate contacts in FluentCRM and retain their tags, email history, and automation positions.
We’re going to work on adding a button for this, and also adding an API method for it so we can have WP Fusion recover from the
Provided email already assigned to another subscriber. error automatically.
Todo: Custom field layouts
We collect a ton of custom field data and at the moment this is kind of a mess in FluentCRM. All the fields are piled up in a list beneath the main contact data. We’re going to work on adding a way to group fields under sub-headings, and also move fields to separate tabs.
#Todo: Custom columns sort
By default you can sort the FluentCRM contacts list by standard fields like Name, Email, and Date Added. We’d like to be able to sort by custom columns like “Last Order Date” or “Last Contacted Support”.
#Todo: Conversion tracking
FluentCRM can track revenue from campaign emails when using WooCommerce or Easy Digital Downloads, but that requires those plugins to be installed on the same site.
Since we have FluentCRM installed on a subdomain, we can’t see the revenue generated from our emails.
We should be able to find a way to sync some ecommerce data into FluentCRM so the Revenue is properly calculated, even across multiple domains. We might look at adding this as a feature for WP Fusion’s Enhanced Ecommerce addon.
Get Automated. Get WP Fusion.
Integrate ecommerce data from multiple sites into FluentCRM with WP Fusion (coming soon 🤭).Buy WP Fusion
Let’s wrap this up.
#Did we save any money?
ActiveCampaign would have cost us $2,748 / year with the new pricing plan.
FluentCRM‘s ongoing costs:
- FluentCRM Pro plugin: $10.75 / month
- Amazon SES email: $0.75 / month
- Hosting via Cloudways: $25 / month
As well, we invested about $2,500 in labor between myself and the team— migrating the data and adding new functionality.
It looks like we’ll break even on the first year (as long as we don’t add too many new features 🙈), and in subsequent years we’ll have significant savings— plus we’ll own our data, and don’t need to be worried about growing our list, or sudden price changes.
#Is FluentCRM right for us?
Yes. It was more work than I was expecting, but I’m happy we made the switch. And I’m excited to be able to actually request and/or build the features we want, rather waiting for innovation from a faceless company.
#Is FluentCRM right for you?
Maybe. If you don’t have a technical background (or have better things to do with your time), then a SaaS solution like ActiveCampaign or Brevo makes a lot of sense. You can get set up in just a few minutes, you don’t need to worry about the server, or the email sending service, and you (usually) have quick access to priority support.
But if you like the idea of owning your data, managing your own sending reputation, and not being at the mercy of unexpected price hikes— FluentCRM (or another self-hosted solution) is definitely worth considering.
Get Automated. Get WP Fusion.
Whichever email marketing tool you use, we hope you'll choose WP Fusion to deeply integrate with WordPress.Buy WP Fusion