<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/new-in-symfony-8-2-messenger-inbox-symfony-blog--pgzviavwu" -->

---
title: New in Symfony 8.2: Messenger Inbox (Symfony Blog)
description: Symfony 8.2 adds a Messenger inbox that skips handlers for messages already processed, even after a worker crash. Brokers deliver messages at least once, so a...
canonical: https://daily.dev/posts/new-in-symfony-8-2-messenger-inbox-symfony-blog--pgzviavwu
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: New in Symfony 8.2: Messenger Inbox (Symfony Blog) | daily.dev
og:description: Symfony 8.2 adds a Messenger inbox that skips handlers for messages already processed, even after a worker crash. Brokers deliver messages at least once, so a...
og:url: https://daily.dev/posts/new-in-symfony-8-2-messenger-inbox-symfony-blog--pgzviavwu
og:image: https://api.daily.dev/og/posts/pGzViaVWU.png
og:image:alt: New in Symfony 8.2: Messenger Inbox (Symfony Blog)
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# New in Symfony 8.2: Messenger Inbox (Symfony Blog)

**[Symfony](https://daily.dev/sources/symfony)** · 3 min read · 2 upvotes · 0 comments

## Summary

Symfony 8.2 adds a Messenger inbox that skips handlers for messages already processed, even after a worker crash. Brokers deliver messages at least once, so a crash before acknowledgment previously made handlers run twice, like double-charging a customer. The new inbox transport option stores the transport name and message id in a messenger_inbox table inside the same transaction as the handlers. If a handler fails, the transaction rolls back the inbox entry too, so retries still work. Retention defaults to 7 days and the feature requires the Doctrine Messenger bridge.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://symfony.com/blog/new-in-symfony-8-2-messenger-inbox>

## Questions this post answers

### How do I prevent Symfony Messenger from running a handler twice after a worker crash?

Enable the new inbox transport option in Symfony 8.2, which stores the transport name and message id in a messenger_inbox database table inside the same transaction as your handlers. When a redelivered message is already recorded there, its handlers are skipped and the message is acknowledged automatically, without you writing custom idempotency checks.

_daily.dev keeps developers upgrading Symfony Messenger pipelines current on patterns like this._

### What configuration is needed to enable the Symfony Messenger inbox in 8.2?

Set identity_stamps to true so every message carries an id, add inbox: true to the transport definition in messenger.yaml, and include doctrine_transaction in the bus middleware since the inbox requires handlers to run inside a database transaction. The symfony/doctrine-messenger bridge must also use the same database connection as the handlers.

_Developers wiring up Messenger transports can track config changes like these on daily.dev._

### What are the limitations of the Symfony Messenger inbox feature?

Retention defaults to 7 days and must exceed the longest time a transport can take to redeliver a message. Messages retried from a failure transport are recorded under their original transport, batch-handled messages are not recorded at all, and messages using DispatchAfterCurrentBusStamp must go to a transport with an outbox or Messenger refuses to send them.

_Teams adopting outbox and inbox patterns can follow these edge cases via daily.dev._

## Similar posts on daily.dev

- [New in Symfony 8.2: Messenger Outbox and Claim Check \(Symfony Blog\)](https://daily.dev/posts/new-in-symfony-8-2-messenger-outbox-and-claim-check-symfony-blog--pyk9pq0hf) · Symfony · 3 upvotes · 0 comments
- [New in Symfony 8.1: Messenger Improvements \(Symfony Blog\)](https://daily.dev/posts/new-in-symfony-8-1-messenger-improvements-symfony-blog--ofndylze4) · Symfony · 4 upvotes · 0 comments
- [New in Symfony 8.2: Faster Messenger Workers \(Symfony Blog\)](https://daily.dev/posts/new-in-symfony-8-2-faster-messenger-workers-symfony-blog--eqqcjtcma) · Symfony · 1 upvotes · 0 comments
- [Implementing the Inbox Pattern for Reliable Message Consumption](https://daily.dev/posts/implementing-the-inbox-pattern-for-reliable-message-consumption-m3ouh8oxb) · Milan Jovanović · 15 upvotes · 0 comments

---

Tags: [#php](https://daily.dev/tags/php), [#symfony](https://daily.dev/tags/symfony)

[View this post on daily.dev](https://daily.dev/posts/new-in-symfony-8-2-messenger-inbox-symfony-blog--pgzviavwu)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"New in Symfony 8.2: Messenger Inbox (Symfony Blog)","url":"https://daily.dev/posts/new-in-symfony-8-2-messenger-inbox-symfony-blog--pgzviavwu","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/new-in-symfony-8-2-messenger-inbox-symfony-blog--pgzviavwu"},"datePublished":"2026-10-26T09:31:50.381Z","dateModified":"2026-10-29T09:58:21.989Z","description":"Symfony 8.2 adds a Messenger inbox that skips handlers for messages already processed, even after a worker crash. Brokers deliver messages at least once, so a...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/327b244859fddae8f3a20d0225898aa0?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/327b244859fddae8f3a20d0225898aa0?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Symfony","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Symfony","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/cc07051b7112472f9729e73c14660a64","url":"https://daily.dev/sources/symfony"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/new-in-symfony-8-2-messenger-inbox-symfony-blog--pgzviavwu","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":2},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"php,symfony","timeRequired":"PT3M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Symfony","item":"https://daily.dev/sources/symfony"},{"@type":"ListItem","position":3,"name":"New in Symfony 8.2: Messenger Inbox (Symfony Blog)"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/new-in-symfony-8-2-messenger-inbox-symfony-blog--pgzviavwu#faq","mainEntity":[{"@type":"Question","name":"How do I prevent Symfony Messenger from running a handler twice after a worker crash?","acceptedAnswer":{"@type":"Answer","text":"Enable the new inbox transport option in Symfony 8.2, which stores the transport name and message id in a messenger_inbox database table inside the same transaction as your handlers. When a redelivered message is already recorded there, its handlers are skipped and the message is acknowledged automatically, without you writing custom idempotency checks. daily.dev keeps developers upgrading Symfony Messenger pipelines current on patterns like this."}},{"@type":"Question","name":"What configuration is needed to enable the Symfony Messenger inbox in 8.2?","acceptedAnswer":{"@type":"Answer","text":"Set identity_stamps to true so every message carries an id, add inbox: true to the transport definition in messenger.yaml, and include doctrine_transaction in the bus middleware since the inbox requires handlers to run inside a database transaction. The symfony/doctrine-messenger bridge must also use the same database connection as the handlers. Developers wiring up Messenger transports can track config changes like these on daily.dev."}},{"@type":"Question","name":"What are the limitations of the Symfony Messenger inbox feature?","acceptedAnswer":{"@type":"Answer","text":"Retention defaults to 7 days and must exceed the longest time a transport can take to redeliver a message. Messages retried from a failure transport are recorded under their original transport, batch-handled messages are not recorded at all, and messages using DispatchAfterCurrentBusStamp must go to a transport with an outbox or Messenger refuses to send them. Teams adopting outbox and inbox patterns can follow these edge cases via daily.dev."}}]}
```

