Features
Everything you need to run lifecycle email.
Built for SaaS. Self-hosted. No contact-count tax.
Flows
Prompt-defined flows
Write what you want in plain English. Claros compiles it once into a deterministic plan and executes it with SQL. The AI never decides timing, targeting, or the send path.
- Three content modes: AI-drafted, fixed-content, and AI-assisted
- Closed vocabulary of conditions keeps plans deterministic
@template,@kb, and@flowreferences inside prompts- Flow classes and priority control concurrency
- Re-entry policies enforced by the database

A prompt becomes a deterministic plan you can read before it runs.

A 4x4 grid of tenure versus recency; every cell is an audience you can email.
Lifecycle
A state machine that knows when to act
Seven lifecycle states, configurable thresholds, engagement depth scoring, and a 4x4 retention grid. Trigger flows on events, lifecycle transitions, or grid cells.
signed_up,activated,engaged,at_risk,dormant,churned,resurrected- Configurable thresholds per tenant
- Engagement depth: power, regular, casual, minimal
- 4x4 retention grid by tenure and recency
- Trigger flows from any lifecycle event or grid cell
Brain
AI drafts. You approve.
The Brain decides whether to send, drafts the email, and runs it through a value gate. Every draft waits in the approvals inbox until a human says yes. Switch a flow to auto-approve once you trust it.
- BYO LLM key: OpenAI, Anthropic, Gemini, Groq, Ollama, or any OpenAI-compatible endpoint
- Rich context packet with lifecycle state, cadence, behavior, and knowledge-base entries
- Value gate prevents generic or misaligned drafts
- Bulk approve or reject up to 100 messages

No AI-drafted email sends until a human says yes.
/v1/track/v1/identify/v1/batchSegment-compatible ingestion, idempotent by messageId.
Ingestion
Send events the way you already do
Segment-compatible /track and /identify. A 2 KB browser snippet. Works with existing Segment SDKs by pointing them at Claros.
- Segment-compatible API with publishable and secret keys
- 2 KB browser snippet served by your own instance
- Idempotent ingestion over a rolling window
- Works with Segment, RudderStack, or PostHog webhooks
Infrastructure
One dependency, one container
One Docker image. Jobs via pg-boss. Embeddings via pgvector. 30-minute quickstart. Scale by splitting into API, worker, and scheduler roles.
- Single dependency: Postgres 16 with pgvector
- No Redis, no Kafka, no separate message broker
- Resend or SMTP transport, including Amazon SES SMTP
- Magic-link auth, owner/member roles
- Scale from one container to many
- RFC 8058 one-click unsubscribe
- Hosted unsubscribe page
- CAN-SPAM postal footer
- Suppression list + CSV import
- Bounce and complaint handling
Compliance
Compliance built in, not bolted on
RFC 8058 one-click unsubscribe, hosted unsubscribe page, CAN-SPAM postal footer, suppression list with CSV import, and automatic bounce and complaint suppression through Resend webhooks.
- One-click unsubscribe headers on every marketing email
- Suppression list enforced before every send
- Import up to 10,000 suppressed contacts per call
- Resend webhooks automatically handle bounces and complaints
Compare
See how Claros compares
Honest comparisons with the tools people switch from.
Three commands on your own server.
Self-hosting is the only way to run Claros today. Install in about five minutes and send your first real email from your own server.
git clone https://github.com/claroshq/claros.git && cd claros
docker compose run --rm install
docker compose up -dNo LLM key needed to start.Full installation guide →