Neutrope Flow

Description

Neutrope Flow helps site owners manage contact records, send scheduled follow-up emails, collect newsletter subscribers with double opt-in, and send newsletters from their own WordPress installation.

The plugin can create or update a contact after a configured Contact Form 7 submission or WooCommerce order event. A mapping can add tags and enroll the contact in an email sequence. Each sequence contains one or more steps, such as an immediate message followed by messages several days later.

A built-in signup form (shortcode or block) collects subscribers with double opt-in: nothing is stored as a contact until the confirmation link in the email is opened. Newsletters are sent to tagged, confirmed contacts in small batches with a configurable hourly limit. A recurring digest can assemble an issue from recent posts on a schedule, and any newsletter can be published as a web page with an archive list.

Email is sent through WordPress wp_mail(). Neutrope Flow is not an SMTP service or an email delivery provider. Delivery depends on the mail configuration of the WordPress site. Scheduled timing also depends on Action Scheduler or WP-Cron and may not run at an exact time on low-traffic sites.

Main features

  • Store contact names and email addresses in dedicated WordPress database tables.
  • Organize contacts with tags.
  • Create text or simple HTML follow-up email sequences.
  • Start sequences from configured Contact Form 7 submissions.
  • Start sequences from configured WooCommerce order events.
  • Schedule later steps with Action Scheduler when available, with WP-Cron as a fallback.
  • Add an unsubscribe link and List-Unsubscribe headers to sequence emails.
  • Skip unsubscribed contacts and prevent duplicate delivery of the same step.
  • Record delivery results in a local log when logging is enabled.
  • Import contacts and tags from a UTF-8 CSV file without sending email or enrolling sequences.
  • Optionally add UTM parameters to eligible CTA links. This option is disabled by default.
  • Emit a recipient-free campaign-template content snapshot after a successful send for compatible local reporting extensions.
  • Show a double opt-in signup form with the [neutrope_flow_signup form="ID"] shortcode or the “Neutrope Flow Signup Form” block. The form works without JavaScript, uses labelled accessible fields, loads no external assets, and protects against spam with a honeypot, a minimum fill time, and per-address and site-wide submission limits.
  • Send a confirmation email with an expiring token. A contact is created only when the link is opened; a confirmed contact can then be enrolled in a welcome sequence.
  • Never re-enable an unsubscribed or bounced contact without a new double opt-in.
  • Create newsletters with a subject, preview text, and simple HTML body; choose the audience by tag; exclude unsubscribed, bounced, and (by default) unconfirmed contacts.
  • Send a test copy, send now, or schedule a newsletter. Delivery runs in batches through Action Scheduler (or WP-Cron) with a configurable batch size and hourly limit, duplicate protection, and a per-recipient log.
  • Add the unsubscribe link, List-Unsubscribe headers, the sender name, and the sender postal address to every newsletter. Newsletters cannot be sent until a postal address is entered.
  • Add UTM parameters to newsletter links, with a per-newsletter campaign value and a per-link content value (the post slug for links to posts on the site).
  • Create a recurring digest: on a schedule (for example the first Thursday of every month at 09:00 in a chosen timezone), the plugin collects posts published since the previous issue, picks a featured post plus a configurable number of new posts, fills the gap with older posts when you allow it, adds a rotating block (for example a tool spotlight), and creates the issue as a scheduled newsletter. The site owner is notified a configurable number of hours before the send and can edit the issue until it goes out.
  • Publish any newsletter as a web page at /newsletter/{slug}/ (base configurable). The page shows the newsletter content only, with noindex, follow by default, a canonical URL, and no recipient data or unsubscribe token; emails then include a “View this email in your browser” link. List published issues with the [neutrope_flow_newsletter_archive] shortcode.

External services and tracking

Neutrope Flow does not make outbound API requests, require an API key, or send contact data to Neutrope or another external service.

The optional UTM feature only adds parameters to eligible links in outgoing email. It does not connect to Google Analytics or transmit analytics data.

Email delivery is handled by the site’s WordPress mail configuration. If the site uses an SMTP or transactional email plugin, that plugin may send data to its configured provider under its own terms and privacy policy.

Privacy

Neutrope Flow stores contact email addresses, names, source information, tags, sequence settings, delivery-log details, and random unsubscribe tokens in the site’s WordPress database. It does not store IP addresses and does not send this data to Neutrope.

After a successful send, the plugin can notify compatible local extensions with the canonical sequence-step subject, body, format, CTA, send time, and UTM metadata. This campaign-template snapshot excludes the contact ID, recipient email address, recipient name, recipient-rendered body, unsubscribe URL, and delivery-log recipient fields.

When the signup form is used, an unconfirmed request (email address, optional name, form reference, random confirmation token, and expiry time) is stored only until the confirmation link is opened or the link expires, after which it is deleted. The date of confirmation is recorded on the contact. Signup rate limiting uses short-lived, salted hashes of the email address; no IP address is read or stored. Newsletter sends record the recipient address and delivery result. The sender name and postal address entered in the settings are shown in every newsletter footer.

A newsletter web version is a public page generated from the newsletter content and the sender identity. It never contains a recipient name, email address, or unsubscribe token; the digest feature reads only published posts of the site. The owner notification for a generated digest issue is sent to the configured address (or the site administrator email) and contains the issue subject and admin links.

Site owners are responsible for obtaining any consent required for follow-up email and newsletters, setting an appropriate retention period, and describing this processing in their privacy policy. Deleting a contact also removes its pending confirmation, newsletter send records, and delivery logs. Deleting the plugin removes its settings and custom database tables.

Languages

Text that subscribers see (signup form, confirmation emails, unsubscribe pages, and email footers) uses English source strings and ships with a Japanese translation in the plugin’s languages folder, so English sites show English and Japanese sites keep their existing wording. Signup form labels left at their defaults follow the site language; labels you customise are shown exactly as typed. Administration screens are currently in Japanese.

Updating and recovery

  1. Before updating, save a matched backup of the database and site files, including the installed plugin ZIP, settings and scheduled jobs. Verify that the backup can be restored in an isolated environment with outgoing mail and external requests blocked. Arrange a maintenance window away from scheduled sends, and inspect pending/running jobs. A backup alone is not proof of recoverability.
  2. Use the WordPress plugin update, or Plugins > Add New > Upload Plugin and replace the installed plugin with the reviewed ZIP. Do not delete/uninstall the plugin: uninstall is not an update or a rollback. Check the version, contacts (including unsubscribed contacts), settings, sequences, logs, newsletters and schedules after updating. For older 0.4.x installations this update adds signup/newsletter/digest storage; retained counts need not equal monthly totals or distinct recipients.
  3. If the dashboard or Digests screen says automatic generation is held for review, review existing drafts, send history and future reservations. The hold concerns digest generation; it does NOT stop existing newsletter sends. The active/paused definition switch is not a substitute for clearing the migration hold. The reviewed-resume form appears only when its safety checks pass. Enter the review reason, explicitly confirm the displayed future reservations, then use the reviewed-resume button. It does not delete/recreate reservations or resend past campaigns.
  4. Do not force resume when reservations are expired, within five minutes of generation, duplicated, running, inconsistent, or being rebuilt. If the form is absent or the warning persists, keep generation held and ask the administrator/support to review the stored state. Do not delete locks, migration markers or scheduler records, repeatedly save, manually run cron, or resend to clear the warning. This release does not automatically replay missed campaigns.
  5. If an update fails, retain the error and job history. Prevent further sending through an operator-managed maintenance procedure before recovery. Restore the matched pre-update files AND database only after reconciling any sends, signups and unsubscribe changes that occurred since the backup. An old database can reintroduce sent jobs or reverse unsubscribe changes; never resume sending blindly after restoration. Rehearse the recovery in isolation first. Replacing only plugin files with an old version is not a supported database rollback.

If /newsletter/{slug}/ returns 404 after updating, save WordPress permalink settings once. Newsletter utm_campaign and utm_content values change for newsletters created after this update; sequence email UTM values are unaffected. Enter a sender postal address in Settings before sending newsletters.

更新と復旧の注意

更新前に、DBとサイトファイルを同時点でバックアップし、旧版ZIP・設定・予約状態も保存してください。メール送信と外部通信を遮断した隔離環境で復旧を確認し、配信予定と重ならない時間帯にWordPress標準更新またはZIP上書きを行ってください。削除・アンインストールは更新や復旧の手順ではありません。

更新後は連絡先(配信停止を含む)・設定・ステップメール・配信履歴・ニュースレター・予約を確認してください。「自動生成:保留(要確認)」はダイジェスト生成の保留であり、既存ニュースレターの送信停止ではありません。「定義:有効」と保留解除は別です。安全確認を通過した場合だけ、ダッシュボード/ダイジェスト画面の確認内容を入力し、将来予約と配信履歴を確認して「確認した予約で自動生成を再開」を使用してください。過去分の再送や予約の作り直しはしません。

期限経過・5分以内・重複・実行中・不整合・予約組み直し中などで再開できない場合は、保留のまま管理者へ確認を依頼してください。ロックや管理記録の削除、保存の連打、cronの手動実行、再送による解消は行わないでください。

障害時は記録を保全し、管理者の手順で送信を止めてから復旧します。バックアップ後の送信・申込・配信停止を照合し、同時点のファイルとDBを復元してください。古いDBへ戻すと送信済み予約の復活や配信停止の巻き戻りが起き得ます。旧版ファイルだけを戻すことや、照合せず送信を再開することは避けてください。

Screenshots

ബ്ലോക്കുകൾ

ഈ പ്ലഗിൻ 1 ബ്ലോക്ക് നൽകുന്നു.

  • Neutrope Flow Signup Form Displays an email signup form with double opt-in.

Installation

  1. Upload the neutrope-flow folder to /wp-content/plugins/, or install the plugin ZIP through the WordPress Plugins screen.
  2. Activate Neutrope Flow.
  3. Open Neutrope Flow > Settings and review the sender address and logging options.
  4. Create tags and an email sequence, then configure a Contact Form 7 or WooCommerce mapping.
  5. Send a test message using a non-production recipient before enabling a mapping for live submissions.

Contact Form 7 is required only for Contact Form 7 mappings. WooCommerce is required only for WooCommerce mappings. Action Scheduler is optional; Neutrope Flow falls back to WP-Cron when it is unavailable.

FAQ

Does Neutrope Flow provide an email delivery service?

No. It sends through WordPress wp_mail(). Configure WordPress mail or a compatible SMTP plugin separately and test delivery before using a sequence.

Does CSV import send email or enroll contacts in a sequence?

No. CSV import only creates or updates contacts and tags. The preview and result screens explicitly confirm that no email or sequence enrollment is performed.

Does the plugin connect to Brevo, Google Analytics, or another API?

No. Neutrope Flow makes no outbound API requests and stores no API keys. Optional UTM parameters may later be processed by an analytics system already used by the site, but the plugin does not connect to that system.

How are follow-up emails scheduled?

Action Scheduler is used when available. Otherwise, Neutrope Flow uses WP-Cron. WP-Cron runs when WordPress receives traffic, so delivery may occur later than the configured time on low-traffic sites.

How does unsubscribe work?

Each contact receives a random unsubscribe token. Sequence emails include a visible unsubscribe link and List-Unsubscribe headers. Unsubscribed contacts are excluded from later sequence deliveries.

What personal data is stored?

The plugin can store a contact’s email address, name, source metadata, tags, confirmation date, delivery-log details, newsletter send records, and unsubscribe token. Unconfirmed signup requests are kept only until confirmed or expired. Data stays in the site’s WordPress database. The plugin does not store IP addresses or transmit contact data to Neutrope.

How does the signup form’s double opt-in work?

Place the form with the shortcode or block. After submission the address receives an email with a random confirmation link that expires after the configured number of hours. No contact exists until that link is opened. An address that is already subscribed receives a short notice instead of a new confirmation, and an unsubscribed or bounced address only returns to the audience after completing a new confirmation.

Who receives a newsletter, and why can’t I send one?

A newsletter goes to contacts with the selected tags whose status is subscribed. Unsubscribed and bounced contacts are always excluded, and by default only contacts confirmed through the signup form are included. Sending, scheduling, and test sends are blocked until a sender postal address is entered in the settings, because bulk email laws such as the US CAN-SPAM Act and Japan’s Act on Regulation of Transmission of Specified Electronic Mail require it. Sequence step emails are not affected.

How does the digest choose posts?

A digest reads published posts of the selected post types (optionally filtered by a taxonomy term) that were published after the previous issue was generated (or within a fixed number of days). The newest post is featured, the next N are listed, and when fewer new posts exist the plugin can fill the remaining slots with random older posts. If there are fewer new posts than the configured minimum, no issue is created and the owner is notified. Filters let a theme or site plugin change the query, the selection, each item’s markup, the subject, and the rotating block.

Is the web version indexed by search engines?

By default a web version is published with noindex, follow (and an X-Robots-Tag header) so links are followed but the page is not indexed. You can choose index, follow per newsletter or digest, or keep the web version off. Before the send starts, only administrators can open the page.

Reviews

ഈ പ്ലഗിന് റിവ്യൂകൾ ഒന്നുമില്ല.

Contributors & Developers

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

Contributors

“Neutrope Flow” has been translated into 1 locale. Thank you to the translators for their contributions.

Translate “Neutrope Flow” into your language.

Interested in development?

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

Changelog

0.7.1

  • Preserve official language-pack translations and fill missing messages from bundled translations, including after language-pack updates and locale switches.
  • No changes to contact data, Reports licensing, delivery settings, or scheduled reservations.

0.7.0

  • Preserve digest migration safety holds and require explicit review before resuming eligible future reservations.
  • Clarify dashboard units, retained log coverage and the distinction between accepted send requests and delivery; add translations for these notices.
  • Document standard updates, reviewed resume and matched database/file recovery precautions.
  • Restored the Qualification Lab explicit-consent adapter that was included in the 0.4.9 distribution. It only synchronizes the learning-support and news tags, never enrolls contacts or schedules email, and never reactivates unsubscribed or bounced contacts.
  • Added recurring digests: a schedule (monthly nth weekday, monthly day, or weekly, in any timezone) assembles an issue from recent posts with a featured item, new items, optional library fill, rotating blocks, and a subject template; the issue is created ahead of time as an editable scheduled newsletter and the owner is notified by email.
  • Added newsletter web versions at /newsletter/{slug}/ with noindex, follow by default, a canonical URL, an admin-only preview before the send, a “View this email in your browser” footer link, the {web_version_url} merge tag, and the [neutrope_flow_newsletter_archive] shortcode.
  • Newsletter utm_content now defaults to the post slug for links to posts on the site; utm_campaign values keep hyphens (for example 2026-10). Sequence-step UTM values are unchanged.
  • Scheduled newsletters can be edited until the send starts.
  • Fixed: links whose href is a merge tag ({unsubscribe_url}) were UTM-tagged before the tag was resolved.
  • Fixed: digest subjects built from post titles showed HTML character references (for example ’ for an apostrophe) because WordPress texturizes titles; the subject is now decoded to plain text once, with tags and line breaks removed. Email bodies, web versions, UTM values, and reporting events are unchanged.
  • Fixed: with Action Scheduler, pending digest generation jobs (which carry digest_id and run_at arguments) were never cancelled when a digest was re-armed, paused, rescheduled, or deleted, so duplicates accumulated. They are now cancelled per hook and group regardless of arguments; other hooks, other groups, and completed or failed history are untouched. WP-Cron sites were not affected.
  • Fixed: deactivating and reactivating the plugin re-creates the daily digest tick immediately. Previously the “checked recently” marker survived deactivation, so a reactivated site had no tick (and no digest re-arming) for up to 12 hours.
  • Fixed: sequence-step delivery events now fire neutrope_flow_delivery_recorded before neutrope_flow_email_dispatched (the order newsletters already used), so a reporting consumer keyed by source_ref receives the campaign-template snapshot on the first send of a month too. Each event is isolated from listener errors. Payload keys are unchanged.
  • New actions and filters: neutrope_flow_digest_generated, neutrope_flow_digest_skipped, neutrope_flow_digest_query_args, neutrope_flow_digest_item, neutrope_flow_digest_items, neutrope_flow_digest_item_html, neutrope_flow_digest_subject, neutrope_flow_digest_slot, neutrope_flow_digest_html, neutrope_flow_digest_campaign, neutrope_flow_digest_notification, neutrope_flow_newsletter_web_html, neutrope_flow_newsletter_web_footer_html, neutrope_flow_newsletter_web_robots, neutrope_flow_newsletter_archive_html.
  • Database: new nf_digests table; slug, web_visibility, issue_no, and items_json columns on nf_newsletters. Uninstall removes them.

0.6.0

  • Added double opt-in signup forms: [neutrope_flow_signup form="ID"] shortcode and the “Neutrope Flow Signup Form” block, with per-form tags, optional welcome sequence, consent text, editable labels, honeypot, minimum fill time, and IP-free rate limiting.
  • Added confirmation emails with expiring tokens and resend limits; contacts are created only on confirmation, and unsubscribed or bounced contacts return only after a new confirmation.
  • Added newsletters: subject, preview text, HTML body, tag include/exclude audience, confirmed-only option, test send, send now, scheduled send, pause/resume/cancel, and batched delivery with a batch size and hourly cap.
  • Added sender identity settings (Reply-To, postal address, footer line). Newsletter sending is blocked until a postal address is entered.
  • Added per-newsletter UTM parameters with per-link utm_content, applied through the existing link-tagging rules.
  • Added neutrope_flow_signup_confirmed, neutrope_flow_newsletter_batch_sent, and neutrope_flow_newsletter_completed actions, and emitted the existing neutrope_flow_delivery_recorded and content snapshot events for newsletters so reporting extensions need no changes.
  • Added nf_signup_forms, nf_pending_confirmations, nf_newsletters, and nf_newsletter_sends tables, nf_contacts.confirmed_at, and nf_email_logs.newsletter_id (created automatically on update; existing data is unchanged).
  • Added a kind filter to the delivery log and new dashboard counters.
  • Subscriber-facing text (signup form, confirmation emails, unsubscribe pages, email footers, block name) now uses English source strings with a bundled Japanese translation loaded from languages/; existing Japanese sites are unchanged.

0.4.9

  • Added a recipient-free campaign-template content snapshot event after successful email dispatch.
  • Added stable monthly source references, canonical subject/body/format/CTA/UTM metadata, and a deterministic SHA-256 content hash for compatible local reporting extensions.
  • Added request-local duplicate suppression and listener-exception isolation so snapshot consumers cannot interrupt email delivery.
  • Added no database migration and no dependency on a reporting plugin.

  • Added an opt-in-only Qualification Lab consent adapter for the learning-support and news tags.

  • The adapter never schedules or sends email, and never reenables an unsubscribed or bounced contact.

0.4.8

  • Standardized admin request, nonce, upload, and transient identifiers with the full plugin-specific prefix.
  • Added nonce validation to the central admin action router before dispatching any handler.
  • Re-audited enqueued assets, admin permissions, unsubscribe confirmation, and prepared SQL identifiers.

0.4.7

  • Removed invalid plugin and author URL headers for WordPress.org review.
  • Replaced inline unsubscribe-page CSS with WordPress enqueue APIs.
  • Added nonce validation for admin edit links that read GET parameters.
  • Renamed the admin notice transient key to a longer plugin-specific prefix.
  • Updated database queries to use prepared identifier placeholders where supported.
  • Raised the minimum WordPress version to 6.2 for prepared identifier placeholder support.

0.4.6

  • Prepared the plugin for WordPress.org review.
  • Rewrote the readme in English and added screenshot captions.
  • Renamed internal PHP classes to longer Neutrope_Flow_* names.
  • Audited database-query warnings and clarified fixed internal table usage.
  • Added uninstall cleanup for WooCommerce mapping data and fallback cron cleanup.
  • Added WordPress 7.0 smoke-test verification.

0.4.5

  • Added a two-step CSV contact import with preview and explicit confirmation.
  • Added UTF-8 validation, row and file-size limits, column detection, duplicate handling, and tag import.
  • CSV import does not send email, enroll sequences, or schedule delivery.

0.4.4

  • Added extension hooks for reporting integrations.
  • Added optional UTM parameters for eligible CTA links. The setting is disabled by default.

0.4.3

  • Improved List-Unsubscribe header compatibility across WordPress mail transports.

0.4.2

  • Added RFC 8058 one-click unsubscribe support.

0.4.1

  • Added a confirmation step for visible unsubscribe links.

0.4.0

  • Added simple HTML email and CTA button support.

0.3.0

  • Added built-in sequence templates.

0.2.0

  • Added WooCommerce order mappings.

0.1.0

  • Initial release.