Maersk Supply Chain Platform

External Target
Notification Engine

An event-driven Spring Boot microservice that consumes supply chain events from Kafka, transforms them per customer subscription, and delivers real-time notifications to external target systems — reliably, at scale.

17+Event Types
3Transformers
3Environments
Subscriptions

Business Value

Bridging Maersk's internal Supply Chain Planning systems with external customer endpoints, delivering the right information to the right people at the right time.

Real-Time Visibility

Customers receive instant notifications for booking confirmations, container milestones, transport events, and document releases — enabling proactive supply chain decisions.

🎯

Subscription-Based Targeting

Each customer only receives events they've subscribed to, routed to their specific endpoints. No noise, no irrelevant data — precision delivery based on authorization and customer codes.

🔄

Standards Compliance

All notifications are formatted as CloudEvents, ensuring interoperability with industry standards. Customers integrate once and receive a consistent, well-documented event schema.

🛡️

Resilient Delivery

Built-in retry mechanisms with exponential backoff, Azure Blob Storage for large payloads, and Caffeine caching for subscription lookups ensure reliable operation under load.

Architecture & Data Flow

Events flow through a pipeline of validation, transformation, and delivery — each step orchestrated by the MessageProcessor.

📨

Kafka Consumer

SCP milestone events arrive via dedicated Kafka cluster with Avro serialization & Schema Registry

⚙️

Message Processor

Validates authorization, fetches subscriptions, orchestrates the full notification pipeline

🔀

Transformer

Routes to Booking, Container, or Transport transformer based on event type for format conversion

☁️

Blob Storage

Large payloads automatically downloaded from Azure Blob Storage when flagged

🚀

Event Delegator

Delivers CloudEvent-formatted notifications via HTTP with retry & exponential backoff

NotificationEventListener

Kafka consumer for SCP milestone events. Receives SupplyChainEvents messages and delegates to the processor with metrics tracking.

AuthorizationService

Validates that the Kafka "Receiver" header matches subscription customer IDs/codes, preventing unauthorized notification delivery.

SubscriptionsService

Fetches customer subscriptions from the external API with Caffeine LoadingCache for high-performance lookups.

TransformerRegistry

Dynamically registers and routes events to BookingEventTransformer, ContainerEventTransformer, or TransportEventTransformer.

BlobStorageService

Downloads large event payloads from Azure Blob Storage when the event is flagged as a large file, with custom exception handling.

MetricsService

Tracks events received, processed, sent, authorization failures, and transformer errors via Micrometer for full observability.

Supported Event Types

The engine handles two categories of events: supply chain notifications (booking & document lifecycle) and transport milestones (container journey tracking).

Supply Chain Notifications & Exceptions
EARLY_CRD LATE_CRD LATE_BOOKING LIGHT_LOAD_VENDOR LIGHT_LOAD_LSP IMP_DOC_VENDOR IMP_DOC_TO_BROKER FINAL_FCR_RELEASED
Transport Milestones (Main Carriage)
CONTAINER_GATE_IN LOADED_ON_VESSEL VESSEL_DEPARTED VESSEL_ARRIVED VESSEL_UNLOADED OUT_GATE EMPTY_CONTAINER_RETURNED RAIL_DEPARTURE RAIL_ARRIVAL

Technology Stack

A modern Java stack optimized for event-driven processing, cloud-native deployment, and full observability.

Core Framework

Spring Boot4.0.3
Spring Kafka
Spring Cloud Azure7.0.0
Spring Retry2.0.12
Java25+

Event Processing

Apache Kafka
Apache Avro1.12.1
Confluent Schema Registry8.1.1
CloudEvents Standard

Observability

OpenTelemetry
Micrometer
Logstash Encoder9.0
Grafana + Tempo

Infrastructure

Azure Blob Storage
Caffeine Cache
Kubernetes + Helm
Docker

Deployment Pipeline

Deployed via Helm charts to Kubernetes across three isolated environments with environment-specific configuration.

DEV

Development

Integration testing, feature validation, full observability stack

PREPROD

Pre-Production

Staging environment mirroring production for final verification

PROD

Production

Live customer-facing deployment with monitoring & alerting

Event Mapping Matrix

Each SCP event type maps to specific target fields through a detailed transformation matrix. Below is the notification event routing overview.

Target Event Code SCP Message Type SCP Event Trigger Soft Code Event Type
EARLY_CRDORDER_STATUSSHIPPER_BOOKING_CONFIRMEDS12NOTIFICATION
LATE_CRDORDER_STATUSSHIPPER_BOOKING_CONFIRMEDS10NOTIFICATION
LATE_BOOKINGORDER_STATUSSHIPPER_BOOKING_CONFIRMEDS8NOTIFICATION
LIGHT_LOAD_VENDORORDER_STATUSSHIPPER_BOOKING_CONFIRMEDS14NOTIFICATION
LIGHT_LOAD_LSPASN_CONTAINERCARGO_STUFFING_STUFFEDC1EXCEPTION
IMP_DOC_VENDORASN_CBLDOCUMENT_RECEIVEDNOTIFICATION
IMP_DOC_TO_BROKERASN_CBLPOUCH_RELEASEDNOTIFICATION
FINAL_FCR_RELEASEDASN_CBLFCR_RELEASEDNOTIFICATION
Milestone SCP Event Trigger Location Type Transport Mode Leg Position
CONTAINER_GATE_INEVENT_GATE_IN_ACTUALPORTVESSELStart
LOADED_ON_VESSELEVENT_LOADED_ON_VESSEL_ACTUALPORTVESSELStart
VESSEL_DEPARTEDEVENT_VESSEL_DEPARTURE_ACTUALPORTVESSELStart
VESSEL_ARRIVEDEVENT_VESSEL_ARRIVAL_ACTUALPORTVESSELEnd
VESSEL_UNLOADEDEVENT_UNLOADED_FROM_VESSEL_ACTUALPORTVESSELEnd
OUT_GATEEVENT_GATE_OUT_ACTUALPORTVESSELEnd
EMPTY_CONTAINER_RETURNEDEVENT_EMPTY_CONTAINER_RETURNED_ACTUALPORTVESSELEnd
RAIL_DEPARTUREEVENT_RAIL_DEPARTURE_FROM_ORIGIN…PORTRAILStart
RAIL_ARRIVALEVENT_RAIL_ARRIVAL_AT_DESTINATION…RAMPRAILEnd

CloudEvent Output

Every notification is wrapped in a CloudEvents envelope for standards-compliant integration.

{
  "specversion": "1.0",
  "type": "com.maersk.booking.milestone",
  "source": "https://external-target-notification-engine",
  "id": "evt_9f2c1a7c-4d2e-4f7a-9f1b-9e0a2d8e3c11",
  "time": "2026-03-20T07:00:00+07:00",
  "datacontenttype": "application/json",
  "data": {
    "event_info": {
      "event_date": "2026-03-20T07:00:00+07:00",
      "event_type": "NOTIFICATION",
      "event_code": "LATE_BOOKING",
      "event_id": "e57b01ad-c27a-4b32-8c30-01fc319772fb"
    },
    "header": {
      "booking_id": "SBK0003011248"
    },
    "payload": {
      "reason_code": "V1",
      "reason_reference": null,
      "reference_data": []
    }
  }
}