Every figure marked Confirmed was pulled live from the WP Engine account, the WordPress database or a public price list on 8–9 August 2026. Figures marked To confirm need an invoice before they go in front of the client. I have not guessed at anything and labelled it as fact.
| Line | Now | Proposed | Saved / year | Confidence |
|---|---|---|---|---|
| HostingWP Engine Premium 1 → Hostinger KVM 8 VPS | $7,272.00 | $311.88 | $6,960.12 | Confirmed |
| Email platformActiveCampaign → own automation + Amazon SES | ? | ≈$48.00 | invoice needed | To confirm |
| WooCommerce Subscriptionslicence retired with the custom plugin | ? | $0 | licence value | To confirm |
| WooCommerce Membershipsreplaced by the access grid | ? | $0 | licence value | To confirm |
| AutomateWoosecond automation engine, absorbed | ? | $0 | licence value | To confirm |
| Mollie gatewayactive, zero subscriptions on it | $0 | $0 | removes risk, not cost | Confirmed |
| Confirmed saving today | $7,272.00 | $359.88 | $6,912.12 |
I can read the WordPress database, so I know exactly which paid plugins are installed. I cannot read what he is being billed for them, and the same goes for ActiveCampaign. Send the ActiveCampaign invoice and the WooCommerce.com renewal list and these rows fill in within the hour. My expectation is that they add several hundred to a couple of thousand a year on top — but that is an expectation, not a number, and it is not going in a client document until it is one.
The site turns over roughly $622,000 a year with 845 active subscriptions and 1,283 active members. Hosting is about 1.2% of revenue. The saving is real and worth taking, but the stronger argument for this whole project is control and speed — the back office is unusable, and that costs more in unworked renewals than the hosting bill does.
The current plan is provisioned for an agency running dozens of sites. The account runs three, one of which is empty.
| Metric | Allowance now | Actually used | KVM 8 provides |
|---|---|---|---|
| Storage | 100 GB | 37.14 GB | 400 GB NVMe |
| Bandwidth | included | 347 GB / cycle | 32 TB |
| Visits | Premium 1 tier | 56,362 total | not metered |
| CPU / RAM | not disclosed | — | 8 vCPU / 32 GB |
| Sandbox sites | 150 | 0 GB used | n/a |
| Root access | no | — | yes |
| Cost | $606.00 / mo | $7,272 / yr | $25.99 / mo |
Patching, MySQL tuning, TLS renewal and uptime response become ours. With 845 live Stripe subscriptions on the box, a renewal cron that stops silently on a Sunday is a revenue incident, not a hosting one. Budget for daily off-server backups and cron monitoring before cutover — roughly $60–120 a year, which barely dents the saving.
Three rented products get replaced by one custom plugin plus one cheap sending relay. The architecture note covers the technical side; this is the commercial case.
| Rented today | What it actually does | Replaced by | Running cost |
|---|---|---|---|
| WooCommerce Subscriptions | recurring billing on top of Stripe | Custom plugin talking to Stripe directly | $0 |
| WooCommerce Memberships | who can see what | Access grid — 49 rules, one table | $0 |
| AutomateWoo | lifecycle automation | Automation engine on Action Scheduler | $0 |
| ActiveCampaign | campaigns + automations + sending | Our engine + Amazon SES for the pipe | ≈$4 / mo |
| Total running cost of the replacement | ≈$48 / yr | ||
Right now nothing can see everything. Reading data lives in one table, subscriptions in another, membership access in a serialised option, and email engagement in ActiveCampaign. A rule like "quiet 30 days and renewing within 45" is impossible today without syncing three systems. In one system it is a single query — and it is exactly the rule that protects a business where 89% of revenue arrives once a year.
Deliverability is the risk, not the code. Never send bulk mail from the VPS. Fix SPF, DKIM and DMARC first — SPF currently authorises GoDaddy with a hard fail while mail runs through Microsoft 365, so the domain is already misconfigured. Split transactional and marketing onto separate sending domains, warm the new one over 4–6 weeks, and run in parallel with ActiveCampaign before cancelling. The failure mode is not "it doesn't work" — it is "it works, and quietly stops landing in inboxes three months later."
Sequenced so that nothing touches live billing until the tidy-up and the parallel run are done. Durations are working estimates, not quotes.
Fix SPF/DKIM/DMARC. Activate authenticated transactional mail. Kill the ThumbPress job failing every 10 minutes since 15 July. Chase the 6 genuinely failed renewals. Deduplicate the market-data cron. Turn on HPOS. Purge 49,967 stale scheduler rows. Drop orphaned tables and cron. Remove Mollie. No behaviour changes, everything gets faster and quieter.
Archive the six dormant plans. Collapse the three Private Investors SKUs. Price or retire the unpriced products. Write down which plan grants which content — the extracted grid is already documented and needs Tom's sign-off.
Provision KVM 8, move 37 GB of files and the 1.4 GB database, keep the FTP and EOD market data ingestion running, re-point Stripe webhooks, cut DNS at GoDaddy. Backups and cron monitoring live before cutover, not after.
Custom tables, Stripe integration, the access grid, the member console, the retention engine. Runs alongside WooCommerce, reading the same Stripe subscriptions. Nothing is switched off.
Both systems live. Reconcile every renewal, every access decision, every tag, daily. WooCommerce stays installed and idle. This is the phase that makes the whole thing safe.
Warm the new sending domain, move automations one at a time, keep ActiveCampaign live until nothing is running on it. The cold legacy list is a separate re-permission project on a separate subdomain.
Deactivate WooCommerce Subscriptions, Memberships and AutomateWoo. Cancel ActiveCampaign. Cancel WP Engine. The saving starts here, not before.