PrimoCRM

Description

PrimoCRM is a CRM and email-marketing system that runs entirely inside your WordPress dashboard. No third-party SaaS, no per-contact pricing, no data leaving your server. Your contacts, campaigns and automations are yours, stored in your own database.

Manage your audience, send broadcast campaigns, build drip sequences, capture leads with forms, and wire it all together with a visual, no-code automation builder. Sending runs through a background queue, so large sends are batched and throttled instead of timing out on a single request.

Everything you get for free

  • Contact management, unlimited contacts, lists, tags and segments. Import and export your audience as CSV.
  • Email campaigns, compose and send broadcast newsletters to any list or segment, with open and click tracking.
  • A background sending engine, emails are queued and sent in throttled background batches via WP-Cron, with a self-healing queue health check so a stalled send never silently drops mail.
  • Email sequences, build automated drip series that nurture contacts over days or weeks.
  • Visual automations, a drag-and-drop builder with triggers (form submitted, tag applied, contact created, and more) and actions (send email, add note, add/remove tag, add to list, and more).
  • Lead-capture forms, build native forms that create or update contacts and fire your automations.
  • Email templates, save and reuse branded templates with merge tags / smart codes (business name, unsubscribe link, manage-subscription link, and more).
  • Dashboard analytics, contact growth, send volume and engagement over time.
  • Send through PHP Mail or your own SMTP, use the WordPress default mailer or point PrimoCRM at any custom SMTP host.
  • One-click migration from FluentCRM, bring your existing contacts, lists and tags across.
  • No usage caps, build as many automations, sequences, forms and templates as you need. Nothing is metered.
  • Privacy-first uninstall, deleting the plugin never erases your CRM data unless you explicitly opt in (see the FAQ).

PrimoCRM Pro

PrimoCRM Pro adds:

  • A/B subject-line testing for campaigns, with automatic or manual winner selection.
  • Drag-and-drop visual email builder for responsive HTML emails.
  • Premium SMTP providers, Amazon SES, SendGrid, Mailgun, Postmark and Brevo, with bounce handling.
  • REST API keys & webhooks, integrate PrimoCRM with the rest of your stack, both inbound and outbound.
  • Advanced reports, detailed campaign, list and engagement breakdowns beyond the free dashboard.
  • 50+ premium automation triggers for WooCommerce, LearnDash, TutorLMS, LearnPress, LifterLMS, AcademyLMS, Easy Digital Downloads, SureCart, and the major form plugins (Gravity Forms, Elementor, Ninja Forms, Formidable, JetFormBuilder).

PrimoCRM is fully functional without Pro, Pro is an optional upgrade.

External services

PrimoCRM does not phone home. It sends no usage data, no analytics and no contact data to us or to anyone else, and it works with no external connection at all.

The plugin can optionally connect to the two anti-spam services below. Both are disabled by default. Neither is contacted until you enter that provider’s keys yourself in PrimoCRM Settings Spam Protection, and disconnecting is simply a matter of clearing those keys.

Cloudflare Turnstile (optional, off by default)

Used to protect your public PrimoCRM forms from spam and bot submissions, if you choose to enable it.

When it is enabled, and only then:

  • Visitors loading a page containing a PrimoCRM form also load the Turnstile widget script from https://challenges.cloudflare.com/turnstile/v0/api.js. As with any script, the visitor’s browser exposes their IP address and user agent to Cloudflare, and Cloudflare uses signals from the browser to decide whether the visitor is human.
  • When that form is submitted, your server sends the challenge token from the widget, your Turnstile secret key, and the submitting visitor’s IP address to https://challenges.cloudflare.com/turnstile/v0/siteverify to confirm the challenge was passed.

No other form data, and no contact or CRM data, is sent to Cloudflare.

This service is provided by Cloudflare, Inc.: Terms of Service, Privacy Policy.

Google reCAPTCHA (optional, off by default)

An alternative anti-spam option for your public PrimoCRM forms, if you choose to enable it instead.

When it is enabled, and only then:

  • Visitors loading a page containing a PrimoCRM form also load the reCAPTCHA script from https://www.google.com/recaptcha/api.js. As with any script, the visitor’s browser exposes their IP address and user agent to Google, and Google collects browser and interaction signals to score the visitor.
  • When that form is submitted, your server sends the reCAPTCHA response token, your reCAPTCHA secret key, and the submitting visitor’s IP address to https://www.google.com/recaptcha/api/siteverify to verify the response.

No other form data, and no contact or CRM data, is sent to Google.

This service is provided by Google LLC: Terms of Service, Privacy Policy.

If you enable either service, remember that your own site’s privacy policy should mention it, since the visitor’s IP address is shared with a third party.

Source code and build process

PrimoCRM’s admin interface is a React application. The files in assets/dist/ and assets/css/ are compiled, production-mode webpack output. The complete, unminified, human-readable source they are built from ships inside this plugin:

  • src/admin/ , the React admin application (JSX) and its SCSS stylesheets
  • src/public/ and src/frontend/ , the public-facing form scripts and styles
  • webpack.config.js and package.json , the build configuration and exact dependency versions

To rebuild every compiled asset from that source, run the following from the plugin directory:

npm install
npm run build

That regenerates assets/dist/*.js, assets/js/primo-forms.js, assets/css/admin.css and assets/css/primo-forms.css exactly as shipped. npm run dev runs the same build in watch/development mode.

The remaining stylesheets in assets/css/ and assets/js/ are plain, unminified, hand-written CSS and JavaScript with no build step: they are already the source.

Third-party libraries bundled into the compiled output are MIT licensed (React, React Router, Chart.js, dnd-kit, flatpickr, react-icons, xyflow); their copyright banners are preserved in the accompanying .LICENSE.txt files. Two of the icons react-icons supplies come from sets under other GPL-compatible licences: the crown from Font Awesome Free (CC BY 4.0) and the send icon from Remix Icon (Apache 2.0). flatpickr is additionally vendored, unmodified, at assets/vendor/flatpickr/ with its licence, and the Inter font at assets/vendor/inter/ is under the SIL Open Font License 1.1, included beside it.

Installation

  1. Upload the primocrm folder to /wp-content/plugins/, or install it directly from Plugins Add New in your dashboard.
  2. Activate the plugin through the Plugins menu in WordPress.
  3. Open PrimoCRM in the admin sidebar to reach the dashboard.
  4. Visit PrimoCRM Settings to set your business name, address and email footer, and to choose how PrimoCRM sends mail (PHP Mail or custom SMTP).
  5. Create a list, add or import contacts, and send your first campaign.

PrimoCRM uses WP-Cron for background sending. On high-traffic sites WP-Cron runs reliably on its own; on low-traffic sites consider configuring a real server cron to hit wp-cron.php so queued emails always go out on schedule. Settings System Status shows the live health of the sending engine, including whether cron is running reliably.

For best performance on large contact databases, PrimoCRM recommends MySQL 5.7+ or MariaDB 10.2+.

FAQ

Does deleting the plugin delete my contacts?

No, not by default. PrimoCRM is safe by default: deactivating or deleting the plugin leaves all your tables, contacts and settings untouched. If you genuinely want a clean wipe, enable Settings Email Settings “Delete all PrimoCRM data when the plugin is uninstalled” before you delete the plugin. Only then will uninstalling drop PrimoCRM’s tables and options. Its scheduled background events are removed either way, since they are not data. On multisite this is handled per site.

Where is my data stored?

In your own WordPress database, in tables prefixed with wp_primocrm_ (matching your site’s table prefix). Nothing is sent to an external service. If you use a premium SMTP provider in Pro, outgoing mail is delivered through that provider, as you’d expect.

Will large campaigns time out?

No. Campaigns are queued and sent in small throttled batches through the background engine, with a periodic queue health check that recovers stalled sends. You can keep working while a campaign goes out.

How fast does PrimoCRM send, and can I send to a large list?

That depends on your sending method. Shared hosts typically cap PHP mail at a few hundred emails per hour, so PrimoCRM defaults to a safe hourly rate there and spreads big sends out automatically — the queue keeps working until every email is delivered. If you connect your own SMTP service (or a premium provider like Amazon SES or SendGrid via Pro), raise or remove the hourly limit in Settings SMTP and PrimoCRM will send at full speed. For lists in the tens of thousands, a dedicated SMTP/ESP service is strongly recommended — both for speed and for deliverability.

How do contacts unsubscribe?

Every email includes unsubscribe and manage-subscription links via merge tags in your footer. Unsubscribes are recorded against the contact and respected on all future sends.

Can I move over from FluentCRM?

Yes. PrimoCRM includes a built-in migration tool that imports your FluentCRM contacts, lists and tags. It’s part of the free plugin.

Do I need Pro?

No. The free plugin is a complete CRM and email-marketing system. Pro adds A/B testing, a visual email builder, premium SMTP providers, the REST API and webhooks, advanced reporting, and 50+ e-commerce/LMS/form automation triggers, but it’s entirely optional.

Is PrimoCRM translation-ready?

Partly. Everything PrimoCRM prints from PHP, including its emails and public pages, uses the primocrm text domain, and a translation template ships in /languages/primocrm.pot. The React admin screens are English-only in this release.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“PrimoCRM” is open source software. The following people have contributed to this plugin.

Contributors

Translate “PrimoCRM” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

1.0.0

  • Official 1.0 release.
  • Reliability: campaign, sequence and automation steps are recorded in a durable execution ledger before they run, so a server timeout mid-step cannot deliver a duplicate email or repeat an action when the worker resumes.
  • Reliability: an email interrupted after it reached the mail provider is never re-sent. It is marked “unconfirmed” with an explanation instead, because a duplicate to a real subscriber is worse than a rare one that needs resending by hand.
  • Reliability: a queue-building error can no longer skip part of a campaign’s audience and then send as though the list were complete. The build retries the affected batch and never finalizes a short send.
  • Reliability: deleting a contact cancels any email still queued for them.
  • Reliability: recipients who unsubscribe or are deleted after a campaign is queued get a terminal “skipped” state, so the campaign completes instead of staying “sending”.
  • Reliability: an automation ending in a Wait step completes instead of repeating.
  • Performance: added database indexes for email open/click tracking and unsubscribe lookups — public tracking endpoints now stay fast on very large contact databases.
  • Reliability: background workers now adapt their time budget to the server’s PHP execution limit, so batches finish cleanly on restrictive shared hosting.
  • Reliability: added self-healing for automation runs and email batches interrupted by a server timeout — nothing gets silently stuck.
  • New: configurable hourly send-rate limit (Settings Email Sending) with a safe automatic default for PHP mail and full speed for SMTP providers.
  • Forms now work correctly on fully page-cached sites (submission tokens no longer expire with the page cache).
  • Contacts CSV export now streams efficiently on very large databases.
  • Old sent-email bodies are pruned automatically after 90 days (filterable) to keep the database lean.
  • Hardening: direct-access guards across all plugin files.
  • New: WooCommerce lifetime value tracking. Each contact now carries their total spend, order count and last-order date, kept in sync automatically from order activity and available in automation conditions (Pro), for example “no order in 90 days” win-back flows or VIP segments.
  • New: {{contact.meta.KEY}} smart code renders any contact custom field inside emails.

0.0.7

  • Added an opt-in, non-destructive uninstall routine: plugin data is preserved unless you explicitly enable deletion in Settings.
  • Added a “Delete all PrimoCRM data on uninstall” control in General settings.
  • Promoted Send Email and Add Note to free automation actions.
  • FluentCRM migration is now available on the free tier.
  • Added full translation support and shipped languages/primocrm.pot.
  • Numerous reliability and hardening improvements to the contacts, campaigns, sequences and analytics modules.