Open-source Email & SMS marketing
you host yourself
Full control over data, ready-made integrations, AI for content creation, automation and webhooks. Set up in Docker in 5 minutes.

AI Campaign Architect
Strategic Email + SMS campaign planner that creates your plan, logic, and forecasts — before you send your first message.
Business context → Audience → AI Strategy → Forecast & Export
Message timeline, goals (education/sales/reminder) and IF/THEN logic
Industry benchmarks + sliders that calculate ROI in real-time

Why NetSendo?
Built for developers who want control, privacy, and flexibility without sacrificing modern features.
How it works
Deploy in Docker
Run docker compose up. NetSendo starts in seconds with Postgres and Redis included.
Add Mailbox
Connect your SMTP server, Gmail, or API provider like SendGrid/Mailgun.
Plan & Launch
Design campaign strategy in Campaign Architect, export to campaigns and launch.
Let AI write your
campaigns in seconds
Stop staring at a blank screen. Netsendo's AI assistant can generate engaging subject lines, write full email body content, and even take voice dictation to craft your message.
Multi-Model Support
Use OpenAI GPT-4o, Anthropic Claude 3.5, or Google Gemini. Your API key, your rules.
Voice Dictation
Just speak your ideas. The AI will transcribe and format them into a professional newsletter.

┌─────────────────┐ STDIO ┌─────────────────┐
│ Claude/Cursor │ ◄────────────► │ MCP Server │
│ (AI Client) │ │ (Docker/npx) │
└─────────────────┘ └────────┬────────┘
│
HTTP/S
│
┌────────▼────────┐
│ NetSendo │
│ (Your inst.) │
└─────────────────┘Supported AI Clients
Example query
"Show my mailing lists and add a new subscriber jan@example.com to Newsletter"
Manage NetSendo with
natural language
Connect Claude, Cursor, or VS Code to your NetSendo instance. Ask questions, manage subscribers, and send messages — all through conversation with AI.
Natural language
Ask 'How many subscribers do I have?' or 'Send an email to John'.
No code required
No need to know the API — AI handles it for you.
Real-time operations
Direct operations on your NetSendo instance.
Experience NetSendo Live
Don't just take our word for it. Log in to our live demo instance and explore the platform's capabilities firsthand.
This is a public demo instance. Data is reset every 24 hours.
Connect with your tools
NetSendo plays nicely with the tools you already use. Orchestrate workflows with n8n and connect any AI model.
Latest Updates
View all releases- Mailing Lists — Grid View Action Buttons Unresponsive:
- Fixed all action buttons (Subscribers, Create Message, Edit, Clone, Delete) on mailing list cards being unclickable. Root cause: the list name <Link> contained a <span class="absolute inset-0"> overlay that covered the entire card (which has position: relative), intercepting all click events and redirecting to the edit page. Added relative z-10 to the action buttons container to elevate them above the overlay.
- Tailwind CSS v3 → v4 Migration:
- Migrated from Tailwind CSS v3 to v4 with new CSS-native configuration approach.
- Replaced @tailwind base/components/utilities directives with @import "tailwindcss" in app.css.
- Added @custom-variant dark (&:where(.dark, .dark *)) to preserve class-based dark mode toggling (replaces darkMode: 'class' from tailwind.config.js).
- Added @theme block with font-family configuration (replaces theme.extend from tailwind.config.js).
- Converted @layer utilities custom classes to @utility syntax.
- Mailbox Reputation — False Blacklist Positives:
- Fixed all mailboxes being incorrectly flagged as "Na czarnej liście!" (Blacklisted). Root cause: Spamhaus, SURBL, and URIBL return special error IPs (e.g., 127.255.255.254) when queried from public/shared DNS resolvers (Google DNS, Cloudflare). The checkDomainDnsbl() method treated any DNS response as "listed". Now validates response IPs and filters out known error/block/test ranges before determining listing status.
- Migration resets all existing reputation data so the corrected logic can re-evaluate on next check.
- Mailbox Reputation — "Error checking reputation" Button Failure:
- Fixed the "Check Reputation" button in Mailbox settings returning an error. Root cause: frontend called route("mailboxes.check-reputation") but the actual route name is settings.mailboxes.check-reputation (due to the Route::prefix('settings/mailboxes')->name('settings.mailboxes.') group). Updated Mailboxes/Index.vue to use the correct route name.
- Brain — Weekly Digest AI Report Crash (AiService::chat() undefined):

