Skip to main content
Open-source transactional outbox

Transactional event delivery, built into Spring Boot.

Persist outgoing work with your business data, then process it asynchronously with ordering, retries, horizontal scaling, and observability.

build.gradle.kts
// Native Namastack Outbox setup
dependencies {
    implementation(platform("io.namastack:namastack-outbox-bom:1.10.x"))
    implementation("io.namastack:namastack-outbox-starter-jpa")
}
Watch · 58 seconds

Every event matters.

Meet Namastack Outbox and see how reliable event delivery fits into Spring Boot.

Transactional outbox

Keep database state and outgoing work consistent.

A database update and a broker publish cannot share one local transaction. Namastack stores the outgoing record beside the business change and processes it after commit.

01

Schedule atomically. Save the outbox record in the business transaction.

02

Process asynchronously. Partition-aware workers claim committed work.

03

Recover explicitly. Retries and fallback handlers deal with delivery failures.

Architecture flow

How it works

  1. Stage 01

    Application transaction

    Business data and the outbox record are persisted in one local transaction.

    @Transactional
  2. Stage 02

    Commit

    The committed outbox record becomes durable work ready for processing.

    Durable state
  3. Stage 03

    Partitioned processing

    Workers poll committed records and coordinate across application instances.

    Partition aware
  4. Stage 04

    Handler execution

    The matching handler runs while records with the same key stay ordered.

    Per-key ordering
  5. Stage 05

    Completion or retry

    Success completes the record; failures follow the configured retry strategy.

    At least once
OrderService.ktKotlin · Spring transaction
// Business state and outgoing work commit together
@Transactional
fun createOrder(command: CreateOrderCommand) {
    val order = orderRepository.save(Order.create(command))
    outbox.schedule(
        payload = OrderCreatedEvent(order.id, order.customerId),
        key = "order-${order.id}"
    )
}
Product capabilities

One focused library, from persistence to operations

Choose the modules your application needs and keep the processing model inside Spring Boot.

Reliable delivery

At-least-once delivery with configurable retries and fallback handling. Consumers should be idempotent.

Strict ordering

Records that share a key retain their processing order across polling cycles.

Horizontal scaling

Partition-aware processing coordinates work safely across multiple application instances.

Flexible persistence

Choose JPA, JDBC, or MongoDB to fit the persistence model already used by the application.

Messaging integrations

Publish through Kafka, RabbitMQ, and Amazon SNS integrations, or implement a custom handler.

Observability

Micrometer metrics, distributed tracing, and context propagation cover the asynchronous boundary.

Understand the delivery contract

At-least-once delivery can produce duplicates. The guarantees guide explains ordering, retries, transactions, and consumer responsibilities.

Read guarantees →
Spring Modulith integration

Use Namastack as the outbox behind Spring Modulith events.

Namastack Outbox is an independent library. Spring Modulith applications can use the official starter to externalize events through Namastack's persistence, processing, retry, ordering, and observability model.

Read the integration guide
Spring Modulithspring-modulith-starter-namastackNamastack OutboxJPA · JDBC · MongoDB

Start with a working outbox.

Install a persistence starter, schedule your first record, and follow the operational model in the documentation.

Support the work

Namastack Outbox is independently developed and maintained as open-source software. Sponsorship supports maintenance, documentation, integrations, and long-term stability.