Notifuse
☁️ Notifuse Cloud — from $16/month · 🎯 Try the Live Demo
Skip the setup and get started instantly with Notifuse Cloud — fully managed hosting starting at just $16/month.
The open-source alternative to Mailchimp, Brevo, Mailjet, Listmonk, Mailerlite, and Klaviyo, Loop.so, etc.
Notifuse is a modern, self-hosted emailing platform that allows you to send newsletters and transactional emails at a fraction of the cost. Built with Go and React, it provides enterprise-grade features with the flexibility of open-source software.
🚀 Key Features
📧 Email Marketing
- Visual Email Builder: Drag-and-drop editor with MJML components and real-time preview
- Campaign Management: Create, schedule, and send targeted email campaigns
- A/B Testing: Optimize campaigns with built-in testing for subject lines, content, and send times
- List Management: Advanced subscriber segmentation and list organization
- Contact Profiles: Rich contact management with custom fields and detailed profiles
🔀 Automations
- Visual Flow Builder: Build multi-step journeys on a canvas — each automation is a graph of nodes with a single trigger as its root
- Node Types:
delay,email,branch,filter,add_to_list,remove_from_list,ab_test,webhook, andlist_status_branch - Timed Delays: Wait minutes, hours or days between steps
- Branching & Filters: Split a journey on contact conditions, or on a contact's status in a given list
- A/B Testing In-Flow: Weighted variants inside an automation, not just on broadcasts
- Webhook Steps: Call an external URL mid-journey, with retry budget
- Enrollment Control: Enroll a contact
onceorevery_timethe trigger fires, with optionalexit_on_reply - Per-Contact State: Every enrollment tracks its own status (
active,completed,exited,failed) and current node, with a per-node history (entered,processing,completed,failed,skipped) - Draft / Live / Paused: Edit safely, then publish — paused automations hold their enrollments
🔧 Developer-Friendly
- Easy Setup: Interactive setup wizard for quick deployment and configuration
- Transactional API: Powerful REST API for automated email delivery
- Webhook Integration: Real-time event notifications and integrations
- Liquid Templating: Dynamic content with variables like
{{ contact.first_name }} - Multi-Provider Support: Connect with Amazon SES, Mailgun, Postmark, Mailjet, SparkPost, SendGrid, and SMTP
📊 Analytics & Insights
- Open & Click Tracking: Detailed engagement metrics and campaign performance
- Real-time Analytics: Monitor delivery rates, opens, clicks, and conversions
- Campaign Reports: Comprehensive reporting and analytics dashboard
🌐 Web Analytics (Staminads)
Privacy-first, cookieless web analytics built in — the Staminads feature set merged into Notifuse, running entirely on PostgreSQL (no ClickHouse, no extra services):
- Engaged-time sessions: sessions measure real visible/focused time (TimeScore), not wall-clock guesses; bounce rate is engagement-based
- Channel attribution: 40 default rules classify traffic (paid click-ids like gclid/fbclid, organic search, social, email) — fully editable per workspace, with one-click backfill of historical data when rules change
- Goals & custom dimensions: conversion tracking with values and properties, plus 10 custom dimension slots (
custom_1..custom_10) - Cookieless & GDPR-friendly: no cookies, no visitor fingerprinting, IPs used only for optional geo lookup and never stored
- Lightweight SDK: ~21 KB gzipped script served by your own Notifuse instance (
/na.js); the user agent is parsed in the browser, so the raw string is never sent to the server - Setup: enable Web Analytics on a workspace, paste the snippet from its settings page, done. Country, region and city come from the MaxMind GeoLite2 City database shipped in the image at
/app/geoip/GeoLite2-City.mmdb— to keep it fresher, drop your own copy into the mounteddata/directory asGeoLite2-City.mmdb(it takes precedence) or setGEOIP_DB_PATH(see geoipupdate). This product includes GeoLite2 data created by MaxMind, available from maxmind.com - Data retention: every session is kept for as long as you keep it. Monthly partitions (
web_sessions_y2026m08and itsweb_pages_*/web_goals_*siblings) are created automatically, and expiring old data is a deliberateDROP TABLEon the partitions you no longer want — instant, and the disk comes back immediately - Scale path: data lives in monthly-partitioned tables per workspace; heavy-traffic installs can run AlloyDB Omni via
compose.alloydb.yamland get columnar-engine acceleration for dashboard queries with zero schema changes - Requirements: PostgreSQL 17 or newer (the shipped compose file stays on 17 — upgrading a major version needs
pg_upgrade, and PostgreSQL 18 also changed its data directory layout)
🎨 Advanced Features
- S3 File Manager: Integrated file management with CDN delivery
- Notification Center: Centralized notification system for your applications
- Responsive Templates: Mobile-optimized email templates
- Custom Fields: Flexible contact data management
- Workspace Management: Multi-tenant support for teams and agencies
🏗️ Architecture
Notifuse follows clean architecture principles with clear separation of concerns:
Backend (Go)
- Domain Layer: Core business logic and entities (
internal/domain/) - Service Layer: Business logic implementation (
internal/service/) - Repository Layer: Data access and storage (
internal/repository/) - HTTP Layer: API handlers and middleware (
internal/http/)
Frontend (React)
- Console: Admin interface built with React, Ant Design, and TypeScript (
console/) - Notification Center: Embeddable widget for customer notifications (
notification_center/)
Database
- PostgreSQL: Primary data storage with Squirrel query builder
📁 Project Structure
├── cmd/ # Application entry points
├── internal/ # Private application code
│ ├── domain/ # Business entities and logic
│ ├── service/ # Business logic implementation
│ ├── repository/ # Data access layer
│ ├── http/ # HTTP handlers and middleware
│ └── database/ # Database configuration
├── console/ # React-based admin interface
├── notification_center/ # Embeddable notification widget
├── pkg/ # Public packages
└── config/ # Configuration files
📚 Documentation
- Complete Documentation - Comprehensive guides and tutorials
🤝 Contributing
We don't accept pull requests. Notifuse is developed in-house, and unsolicited pull requests will be closed without review — please don't spend your time on one.
Issues, on the other hand, are very welcome and are the best way to help:
- Report a bug — steps to reproduce, your version, and what you expected instead
- Request a feature — describe the problem you're trying to solve rather than a specific implementation
The licence lets you read, fork and modify Notifuse, and run it in production — including for other people. What it does not let you do is use a licensed feature without a key, or strip out the check. See LICENSING.md.
We do not currently accept pull requests. If we ever invite one, it will be under the CLA.
📄 License
Notifuse v40.0 and later are released under the Business Source License 1.1,
which becomes AGPL-3.0-or-later four years after each version is published.
v39.x and every earlier release remain AGPL-3.0, permanently — this change is not
retroactive and cannot be. The web_analytics_sdk/ directory is AGPL-3.0-or-later in
every version.
Five capabilities need a licence key; everything else does not, and the send path co