Back to Projects
System DesignKotlin • Event-Driven • AWS

Notification Template Processor

A template processing pipeline that transforms incoming events into rendered notifications. Watch how messages flow through validation, strategy selection, template resolution, and rendering.

📨

SNS Message

Incoming notification event

1

Validation

Validate user & determine destinations

2
🎯

Strategy

Domain-specific token preparation

3
📄

Template

Resolve & retrieve from S3

4

Render

Interpolate tokens into template

5
📤

SQS Delivery

Ready for notification delivery

6
📨Input Event
{
  "actionType": "PAYMENT_SCHEDULED",
  "tokens": {
    "PAYMENT_AMOUNT": "100.00",
    "PAYMENT_DATE": "2025-12-15",
    "ACCOUNT_LAST_4": "1234"
  },
  "userId": "550e8400...",
  "accountId": "acct_12345"
}
Output will appear here

Processing Stages

📨

1. Event Ingestion

  • SNS message arrives with action type and raw tokens
  • Contains user/account identifiers for routing
  • Optional brand identifier for multi-tenant support

2. Validation & Routing

  • Validates user access and permissions
  • Determines notification destinations (Email, SMS, Push)
  • Creates internal notification DTO
🎯

3. Token Preparation

  • Strategy pattern for domain-specific token preparation
  • 14 strategies (Payment, Account, Dispute, etc.) each handle their action types
  • Makes the flow easier to read, evolve, and test independently
📄

4. Template Resolution

  • Maps (ActionType, DestinationType) → templateId via registry
  • Retrieves HTML template from S3 storage
  • Path: s3://{bucket}/{brand}/templates/{action}.html

5. Rendering

  • Extracts title/body from HTML (meta tags, divs, or fallbacks)
  • Interpolates tokens using {{TOKEN_NAME}} syntax
  • HTML-escapes values for security
📤

6. Delivery

  • Complete notification ready for delivery
  • Includes title, body, rendered HTML, destinations
  • Queued to SQS for downstream notification service

Hexagonal Architecture

Domain Layer

Framework-agnostic core

  • Strategy interfaces
  • Domain-specific contracts
  • Metadata annotations
  • Actions & domain models
Application Layer

Use cases & orchestration

  • Port interfaces
  • Use case orchestration
  • Strategy composition
  • Service contracts
Infrastructure Layer

Framework-specific adapters

  • Strategy implementations
  • Port adapters
  • External services (S3, etc.)
  • Framework integrations

Key Patterns

🔷

Hexagonal Architecture

Clean separation of Domain, Application, and Infrastructure layers with ports and adapters for flexibility.

🎯

Strategy Pattern

Domain-specific token preparation for each action type. Makes the flow readable, evolvable, and testable.

📋

Registry-Based Resolution

YAML registry maps (ActionType + Destination) → templateId. Runtime changes without deployment.

☁️

S3-Based Templates

Templates stored in S3 organized by brand and action type. Marketing updates independently.

HTML Template Processing

Extracts title/body from HTML meta tags or divs. Token interpolation with {{PLACEHOLDER}} syntax.

📡

Multi-Channel Delivery

Single event triggers Email, SMS, and Push via SNS/SQS decoupled async processing.