Hi Adam.
The behavior is caused by the difference between SendGrid bounce types and the current Mautic callback model.
SendGrid reports:
type: "bounce" as a permanent or hard bounce;
type: "blocked" as a temporary or soft bounce.
The SendGrid Callback plugin currently maps both events to Mautic’s BOUNCED Do Not Contact status. Because of that, Mautic disables the Email Channel immediately after the first blocked event.
1. Preventing the Email Channel from being disabled
As a temporary workaround, disable Handle blocked events in the SendGrid Callback plugin settings.
Keep Handle bounce events enabled.
This means:
- hard bounces (
type=bounce) will still disable the Email Channel;
- blocked/soft bounces (
type=blocked) will be ignored and will not disable it.
This workaround also means that blocked events will not be stored as a separate soft-bounce status, because Mautic currently has no separate native DNC reason for soft bounces.
The “retry” setting in Mautic should not be confused with recipient-level soft-bounce retries. Mautic’s retry settings are related to failed message processing, not to a provider reporting a blocked recipient after the message has been submitted.
2. Red and yellow bounce icons
This appears to be a Mautic core UI limitation.
Mautic’s standard DNC model distinguishes the email channel and the DNC reason, but it does not expose a separate soft-bounce state in the contact list view. Therefore the list view can display all email DNC records using the same bounced indicator.
The individual contact view may show more detailed information because it can display the stored event comments and bounce reason.
3. Segments for soft and hard bounces
Mautic currently provides a general bounced-email filter, but it does not provide a native segment filter for:
- soft bounces only;
- hard bounces only;
- SendGrid
type=blocked versus type=bounce.
The current plugin preserves the SendGrid type, status, and reason in the event comments, but those comments are not exposed as separate segment fields.
A complete solution would require one of the following:
- A Mautic core enhancement adding a dedicated soft-bounce data model and segment filters.
- A plugin extension that stores SendGrid bounce events in its own table and exposes custom segment filters.
- A custom contact field populated by an external automation.
4. SendGrid IP blocklists
The callback plugin does not control the IP used for sending. It only processes webhook events after SendGrid has attempted delivery.
If the recipient server is blocking a SendGrid shared IP, the usual SendGrid-side options are:
- request delisting or remediation through SendGrid support;
- use a dedicated SendGrid IP;
- create a dedicated IP pool;
- assign the sending traffic to that pool;
- complete reverse DNS, SPF, DKIM, and IP warm-up.
SendGrid shared-pool IPs can change without notice. Dedicated IPs and IP pools provide more control over the sending reputation. SendGrid Dedicated IP documentation
SendGrid IP Pools documentation
For API-based sending, the SendGrid Mail Send API supports an ip_pool_name property. However, the current Mautic SendGrid callback plugin does not select an IP pool, because it is not the sending transport. The sending transport would need to expose or set that option.
Also note that SendGrid bounce events do not always include the sending IP, especially for delayed/asynchronous bounces. The SendGrid Email Activity data and SendGrid support are the proper places to identify which IP or pool was involved.
Current recommendation
For the current plugin:
- enable handling of hard bounce events;
- disable handling of blocked events if temporary SendGrid blocks should not disable contacts;
- do not retry hard bounces automatically;
- use a dedicated SendGrid IP or IP pool if the problem is caused by shared-IP reputation;
- treat separate soft-bounce tracking and soft/hard bounce segmentation as a separate feature request for the plugin or Mautic core.
The current plugin successfully receives and processes SendGrid webhooks, but native soft-bounce retry and soft/hard bounce segmentation are not currently provided by Mautic 7.2.1.