Problem and context

Over time, our communication stack has grown organically across multiple tools, delivery channels, and implementation paradigms. As a result, we now face the following challenges:

<aside> 💡 Fragmentation: Communication to users happens via banners, push notifications, OneSignal journeys, in-app cards, emails, and surveys—all with different data sources, logic, storage, and rendering mechanisms.

Duplication and Redundancy: Some messages are sent through multiple channels simultaneously often with inconsistent content or tone.

Poor Maintainability: Some systems rely on brittle implementations or schema-less migrations for push messages. Others require manual PRs to deliver updates.

Inefficient Targeting: There’s no shared system of targeting or segmentation across all communication channels, which limits personalization and leads to user fatigue.

Limited Observability: There is no unified place where users can see what messages they've received or dismissed, nor any clear audit trail for internal teams. (we have logs but not sure folks know how to check them or filter them?)

Inconsistent UX and Tone: Each channel looks and feels different, with no unified design system or voice. Learn and Manage handle UI logic differently for the similar message types (e.g., in-app notifications).

Hard to Scale: Adding new campaigns or flows requires one-off logic and duplication of work across product, design, and engineering.

</aside>

Characterization and Summary of Communication Systems

➡️ Systems for Sending Information

⬅️ Systems for Receiving Information from Users

Proposal

here you can find the diagram

here you can find the diagram

We propose building a centralized Messaging Infrastructure Layer, consisting of:

1. Shared messages Table

id created_at updated_at cta created_by source
1 … … <null> 763212 learn
2 … … <null> 718955 learn

2. A Delivery Routing Engine