PHPackages                             bloomidea/mautic-plugin-resend-nonopeners - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Mail &amp; Notifications](/categories/mail)
4. /
5. bloomidea/mautic-plugin-resend-nonopeners

ActiveMautic-plugin[Mail &amp; Notifications](/categories/mail)

bloomidea/mautic-plugin-resend-nonopeners
=========================================

Mautic plugin to resend segment emails to contacts who did not open them, with automatic segment cloning and translation handling.

v1.0.5(3mo ago)15[1 issues](https://github.com/Bloomidea/mautic-plugin-resend-nonopeners/issues)GPL-3.0-or-laterPHP

Since Apr 11Pushed 3mo agoCompare

[ Source](https://github.com/Bloomidea/mautic-plugin-resend-nonopeners)[ Packagist](https://packagist.org/packages/bloomidea/mautic-plugin-resend-nonopeners)[ RSS](/packages/bloomidea-mautic-plugin-resend-nonopeners/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (1)Versions (7)Used By (0)

Mautic Plugin: Resend to Non-Openers
====================================

[](#mautic-plugin-resend-to-non-openers)

[![Packagist Version](https://camo.githubusercontent.com/b26383bf5dfbe16f3d58a7eae4b43940638fe855317bdd32f7dd72b8004e6662/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f626c6f6f6d696465612f6d61757469632d706c7567696e2d726573656e642d6e6f6e6f70656e6572732e737667)](https://packagist.org/packages/bloomidea/mautic-plugin-resend-nonopeners)[![License](https://camo.githubusercontent.com/81712c02086930bfb046339394a915a2e82544c0a5e9a6b7e2fb8367a9a70c62/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f426c6f6f6d696465612f6d61757469632d706c7567696e2d726573656e642d6e6f6e6f70656e6572732e737667)](LICENSE)

A Mautic plugin that adds a one-click "Resend to Non-Openers" action for segment (broadcast) emails.

After a segment email has been sent, this plugin lets you resend it to contacts who did not open it. It automates the manual workflow of cloning the segment with a "not read email" filter, cloning the email (including all its translations), and publishing it for the broadcast cron to send.

Why
---

[](#why)

Every major email marketing platform (Mailchimp, Brevo, ActiveCampaign) has a one-click resend-to-non-openers feature. In Mautic it previously required a tedious manual workflow. Mailchimp data from 1,300 resend campaigns shows resends add **+8.7 percentage points** to the original open rate (from a 26.7% average) — it's one of the highest-ROI email actions.

Features
--------

[](#features)

- **One-click resend** from the email detail page (Options dropdown → "Resend to Non-Openers")
- **CLI command** for automation: `bin/console mautic:emails:resend-nonopeners  [--dry-run]`
- **API endpoint**: `POST /api/resend-nonopeners/{id}`
- **Multilingual support** — clones parent email and all translation children, filters across all translation IDs
- **Automatic segment creation** — new segment combines "member of original audience" + "did not read email" filters
- **Auto-categorization** — creates a "Resend Non-Openers" category and assigns it to all cloned emails and segments for easy filtering in lists
- **Auto-cleanup** — when the resend email finishes sending (or is manually unpublished), the linked segment is automatically unpublished too
- **Safe by default** — each email can only be resent once; a resend cannot be resent again
- **Fully async** — the HTTP request returns immediately; segment rebuild and delivery happen in the background via Mautic's standard crons, so it works for segments of any size without timeouts
- **Uses the standard broadcast cron** — scales to any list size, respects rate limits

Screenshots
-----------

[](#screenshots)

**"Resend to Non-Openers" in the Options dropdown** (only appears for segment emails with sends)

[![Dropdown menu showing Resend to Non-Openers button](https://private-user-images.githubusercontent.com/104880/571907219-dc774791-511b-4a02-b585-eee2705e9b5e.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQzNTI5MTIsIm5iZiI6MTc4NDM1MjYxMiwicGF0aCI6Ii8xMDQ4ODAvNTcxOTA3MjE5LWRjNzc0NzkxLTUxMWItNGEwMi1iNTg1LWVlZTI3MDVlOWI1ZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNzE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDcxOFQwNTMwMTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xYTJjOGYzYTI1ZGZhMmVhOGMwMzllOGRkMTIyNzYwYWU5YjU4ZDExNDU5ZDE2ZTI3MzI1MDAwMjEzYWU4MjBiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.ointnytIlu2UPnqURAHBHtHaCRktwo95ZxheAvmVmdo)](https://private-user-images.githubusercontent.com/104880/571907219-dc774791-511b-4a02-b585-eee2705e9b5e.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQzNTI5MTIsIm5iZiI6MTc4NDM1MjYxMiwicGF0aCI6Ii8xMDQ4ODAvNTcxOTA3MjE5LWRjNzc0NzkxLTUxMWItNGEwMi1iNTg1LWVlZTI3MDVlOWI1ZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNzE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDcxOFQwNTMwMTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xYTJjOGYzYTI1ZGZhMmVhOGMwMzllOGRkMTIyNzYwYWU5YjU4ZDExNDU5ZDE2ZTI3MzI1MDAwMjEzYWU4MjBiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.ointnytIlu2UPnqURAHBHtHaCRktwo95ZxheAvmVmdo)

**Confirmation modal**

[![Confirmation modal with email name and notes](https://private-user-images.githubusercontent.com/104880/571907253-4743dc05-6976-459e-bfa4-5a77cf35db34.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQzNTI5MTIsIm5iZiI6MTc4NDM1MjYxMiwicGF0aCI6Ii8xMDQ4ODAvNTcxOTA3MjUzLTQ3NDNkYzA1LTY5NzYtNDU5ZS1iZmE0LTVhNzdjZjM1ZGIzNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNzE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDcxOFQwNTMwMTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kY2RjZWM4ZmNjZWMxZWFjZTNlMDBjYjgxOTUxYWVlNTg4YTQ5M2Y5NTc0NmFmNjI5OTViZTdhMmFmZGY3MDAwJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.67dbOL5Tdr8EIRX3YNtp6UFuIPDRAJuVxsZTriTee2g)](https://private-user-images.githubusercontent.com/104880/571907253-4743dc05-6976-459e-bfa4-5a77cf35db34.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQzNTI5MTIsIm5iZiI6MTc4NDM1MjYxMiwicGF0aCI6Ii8xMDQ4ODAvNTcxOTA3MjUzLTQ3NDNkYzA1LTY5NzYtNDU5ZS1iZmE0LTVhNzdjZjM1ZGIzNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNzE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDcxOFQwNTMwMTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kY2RjZWM4ZmNjZWMxZWFjZTNlMDBjYjgxOTUxYWVlNTg4YTQ5M2Y5NTc0NmFmNjI5OTViZTdhMmFmZGY3MDAwJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.67dbOL5Tdr8EIRX3YNtp6UFuIPDRAJuVxsZTriTee2g)

**Auto-generated segment with membership + non-opener filters**

[![Segment filters showing segment membership and read email excluding](https://private-user-images.githubusercontent.com/104880/571907490-0635beeb-d253-4c92-9e91-607e86c9d4b3.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQzNTI5MTIsIm5iZiI6MTc4NDM1MjYxMiwicGF0aCI6Ii8xMDQ4ODAvNTcxOTA3NDkwLTA2MzViZWViLWQyNTMtNGM5Mi05ZTkxLTYwN2U4NmM5ZDRiMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNzE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDcxOFQwNTMwMTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yNGYxNTU1YjEwZDg2MTVhMWFmOWNmYTllMjFlZjMyYWNkY2VhOGU1NzViNmU2ZGFmZmVjYjI1MDNmNmViZDM2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.lgGGrgi43s-ZbGcdWbk0SZtMI7uYuIYtfFm3CvVDRoA)](https://private-user-images.githubusercontent.com/104880/571907490-0635beeb-d253-4c92-9e91-607e86c9d4b3.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQzNTI5MTIsIm5iZiI6MTc4NDM1MjYxMiwicGF0aCI6Ii8xMDQ4ODAvNTcxOTA3NDkwLTA2MzViZWViLWQyNTMtNGM5Mi05ZTkxLTYwN2U4NmM5ZDRiMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNzE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDcxOFQwNTMwMTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yNGYxNTU1YjEwZDg2MTVhMWFmOWNmYTllMjFlZjMyYWNkY2VhOGU1NzViNmU2ZGFmZmVjYjI1MDNmNmViZDM2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.lgGGrgi43s-ZbGcdWbk0SZtMI7uYuIYtfFm3CvVDRoA)

For the full visual walkthrough (8 screenshots), see [mautic/mautic#16004](https://github.com/mautic/mautic/issues/16004).

How it works
------------

[](#how-it-works)

1. You click "Resend to Non-Openers" on a sent segment email
2. The plugin creates a new segment with two filters:
    - **Segment Membership — including any of — \[original segment(s)\]**
    - **Read a specific email — excluding any of — \[original + all translations\]**
3. The plugin clones the email and all its translation children, assigns them to the new segment, and publishes them
4. Both the segment and the cloned emails are tagged with a "Resend Non-Openers" category (auto-created on first use)
5. A record of the resend is stored in the `email_resends` table so the email can't be resent again
6. The HTTP request returns immediately — everything from here is async via Mautic's standard crons
7. `mautic:segments:update` rebuilds the new segment to populate the non-opener contacts
8. `mautic:broadcasts:send` picks up the cloned email and sends it to the non-openers
9. When all non-openers have been sent to, Mautic auto-unpublishes the resend email
10. The plugin detects the unpublish and automatically unpublishes the linked segment too — no cleanup needed

Requirements
------------

[](#requirements)

- Mautic 7.0 or newer
- PHP 8.2+

Installation
------------

[](#installation)

### Via Composer (recommended)

[](#via-composer-recommended)

The plugin is published on [Packagist](https://packagist.org/packages/bloomidea/mautic-plugin-resend-nonopeners). If your Mautic installation has a `composer.json` (source-based install), run:

```
composer require bloomidea/mautic-plugin-resend-nonopeners
bin/console mautic:plugins:reload
bin/console cache:clear
```

Composer reads `install-directory-name` from the plugin's `composer.json` and installs it to `plugins/MauticResendNonOpenersBundle/` automatically.

### Manual installation (for runtime Docker images)

[](#manual-installation-for-runtime-docker-images)

The official `mautic/mautic:7-apache` Docker image is a runtime build without `composer.json`, so `composer require` will not work inside it. In that case, clone the plugin directly into the plugins directory and pin a tag for reproducible builds:

```
cd /path/to/mautic/plugins
git clone --branch v1.0.1 --depth 1 https://github.com/Bloomidea/mautic-plugin-resend-nonopeners.git MauticResendNonOpenersBundle
rm -rf MauticResendNonOpenersBundle/.git
bin/console mautic:plugins:reload
bin/console cache:clear
```

For Dockerfile usage, add the same commands as a `RUN` step. To upgrade, bump the tag and rebuild.

The plugin creates an `email_resends` table automatically from its entity metadata during plugin reload.

Usage
-----

[](#usage)

### UI

[](#ui)

1. Open a segment email that has been sent to at least one contact
2. Click the **Options** dropdown (the chevron next to the Edit button)
3. Click **Resend to Non-Openers**
4. Confirm in the modal
5. The broadcast cron will send the cloned email to non-openers on its next run

> **Note on continuous-sending emails:** if the original email has "continue sending" enabled, "non-openers" will include very recent recipients. The plugin still allows the resend — the decision of when to trigger it is up to you.

### CLI

[](#cli)

```
# Dry run — check if an email is eligible without doing anything
bin/console mautic:emails:resend-nonopeners 42 --dry-run

# Execute the resend
bin/console mautic:emails:resend-nonopeners 42
```

### API

[](#api)

```
curl -X POST "https://your-mautic.example.com/api/resend-nonopeners/42" \
  -u admin:password
```

Response:

```
{
  "success": 1,
  "emailId": 123,
  "segmentIds": [45]
}
```

Constraints
-----------

[](#constraints)

- Only segment (broadcast) emails can be resent — not template/campaign emails
- The original email must have been sent to at least one contact (`sentCount > 0`). This includes emails with "continue sending" enabled, since those never reach `sendingStatus === 'sent'` despite having real non-openers to target.
- Each email can only be resent once
- A resend email cannot be resent again
- Triggering from a translation child automatically resolves to the parent
- Permission check: requires `email:emails:editown` or `email:emails:editother`

Technical approach
------------------

[](#technical-approach)

The plugin is implemented without any modifications to Mautic core:

- **No core entity changes** — a plugin-owned `EmailResend` entity stores the relationship between an original email and its resend, instead of a column on the `emails` table
- **No template modifications** — the UI button is injected via the `CoreEvents::VIEW_INJECT_CUSTOM_BUTTONS` event
- **Leverages existing Mautic primitives** — uses the `lead_email_received` segment filter (with "excluding any of" operator) and the `leadlist` membership filter; no custom SQL
- **Standard broadcast pipeline** — the cloned email is published and picked up by `mautic:broadcasts:send` like any other segment email

Related links
-------------

[](#related-links)

- GitHub issue: [mautic/mautic#16004](https://github.com/mautic/mautic/issues/16004)
- Forum discussion: [Add Resend to Non-Openers action for segment emails](https://forum.mautic.org/t/add-resend-to-non-openers-action-for-segment-emails/38042)

License
-------

[](#license)

GPL-3.0-or-later — same license as Mautic core.

###  Health Score

29

—

LowBetter than 57% of packages

Maintenance60

Regular maintenance activity

Popularity5

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity38

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

6

Last Release

103d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/aba63db544db2ee4535151d72c8997fddeed8213ec9aaa5b93ca4af4b9be8f1c?d=identicon)[introfini](/maintainers/introfini)

---

Top Contributors

[![introfini](https://avatars.githubusercontent.com/u/104880?v=4)](https://github.com/introfini "introfini (10 commits)")

---

Tags

pluginemailMauticresendnon-openers

### Embed Badge

![Health badge](/badges/bloomidea-mautic-plugin-resend-nonopeners/health.svg)

```
[![Health](https://phpackages.com/badges/bloomidea-mautic-plugin-resend-nonopeners/health.svg)](https://phpackages.com/packages/bloomidea-mautic-plugin-resend-nonopeners)
```

###  Alternatives

[etailors/mautic-amazon-ses

Amazon SES Mailer Plugin for Mautic

574.2k](/packages/etailors-mautic-amazon-ses)[ferdous/laravel-otp-validate

Laravel package for OTP validation with built-in features like retry and resend mechanism. Built in max retry and max resend blocking. OTP/Security Code can be send over SMS or Email of your choice with user-defined template.

7124.6k](/packages/ferdous-laravel-otp-validate)[pabloveintimilla/mautic-amazon-ses

Mautic 5 plugin that provides Amazon SES as an email transport and callback to process bounces

452.4k](/packages/pabloveintimilla-mautic-amazon-ses)[princealikhan/laravel-mautic-api

Free and Open Source Marketing Automation API

405.9k](/packages/princealikhan-laravel-mautic-api)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
