What it is
uRemove normalizes user state, enforces send policy, and closes the feedback loop between delivery and engagement — so every message sent has a reason to exist.
Every recipient is a normalized record — tier, engagement history, suppression state, momentum. Sends follow the state, not a schedule.
Classification, consent, fatigue, cooldown, and tenant rules are enforced before any render. If a send would be noise, it is refused.
Delivery and engagement events flow back into user state in real time. The next message is shaped by the last one.
Architecture
The engine is generic. Client-specific logic lives in configuration. Templates reference normalized fields — never raw source data.
Lifecycle, classification, policy, delivery, webhook ingestion. Fully client-agnostic.
L1Normalizes external sources into internal fields. One lightweight adapter per client.
L2Per-client rules, tiers, categories, and CTA behavior — stored as data, not code.
L3Slot-based composition, versioned JSON schema, live preview with sample state.
L4Principles
A short list of non-negotiable rules the platform enforces at build, deploy, and runtime.
Every email has exactly one primary CTA. No stacking, no ambiguity.
Send eligibility depends on engagement history and consent — not on metric changes alone.
Templates reference internal fields. Raw upstream field names never appear in content.
Every webhook carries a unique event id. Duplicate delivery cannot distort state.
Every record is scoped by tenant. No query is allowed to cross boundaries.
If a rule can vary per client, it lives in configuration. The core stays generic.