Duplicate Email Processing

I have an email-triggered workflow that has been running successfully for over a year without any issues.

Recently, I started noticing a problem when multiple emails arrive within a short period of time. In such cases, the workflow sometimes processes the same email more than once, resulting in duplicate executions.

The trigger is configured to run when a new email arrives, with a polling interval of 1 minute (see screenshot below).

Since multiple emails can arrive at the same time, I have implemented a loop to process the emails one by one, as shown in the screenshot. Despite this, I am still seeing duplicate processing for some emails.

Now there was emails arrived at:

  • 12:56
  • 12:57
  • 12:58
  • 12:59

The trigger behavior was as follows:

  • Trigger 1 processed the 12:56 email.
  • Trigger 2 returned two emails: 12:57 and 12:58.
  • Trigger 3 again returned the same two emails: 12:57 and 12:58.
  • Trigger 4 returned 12:58 and 12:59.
  • Trigger 5 returned 12:59.

Has anyone experienced a similar issue? Are there any known changes or settings that could cause the same email to be picked up multiple times when several emails arrive simultaneously?

Any suggestions would be appreciated.

@NISHANT_GARG your loop only dedupes inside one execution, but under bursty load the trigger re-fetches the same email across separate executions (overlapping 1-min polls), so those slip past it. drop a Remove Duplicates node right after the trigger, set Operation to Remove Items Processed in Previous Executions, Keep Items Where = Value Is New, and dedupe on the Message-ID. it persists across executions so a repeat email gets dropped.

What happend if i remove the polling, Only trigger will solve this issue?

@NISHANT_GARG it wouldnt fully solve it. the email trigger polls by design so theres no push mode to remove, and even a webhook/push trigger re-delivers sometimes, theyre all at-least-once, theres no exactly-once in n8n. the Remove Duplicates node on the message-id is the only thing that actually guarantees no reprocessing, so keep that regardless of which trigger you use.