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.

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- Variable Insertion: Fixed [[!fname]] (Vocative Name) variable insertion in Template Builder, which was previously inserting [object Object].
- System Emails: Added [[!fname]] variable to the list of available placeholders in System Email editor.
- Campaign Auditor Improvements:
- Implemented data-driven revenue loss estimation by integrating real transaction data from StripeTransaction, PolarTransaction, StripeProduct, PolarProduct, Funnel, and SalesFunnel.
- Added calculateRevenueMetrics() method to CampaignAuditorService for fetching and normalizing user revenue data (AOV, monthly revenue, active funnels).
- Added new revenue loss indicator in the auditor UI, showing whether estimations are based on "Real transaction data" or "Industry benchmarks".
- Docker Compose (Development): Added missing scheduler and queue services to docker-compose.dev.yml to enable cron jobs and queue processing in development environment. Previously, scheduled tasks like autoresponders, abandoned cart detection, and other Laravel schedule commands would not run on dev environment.
- Autoresponder Queue: Fixed a bug where autoresponder messages could lose their scheduled status and be incorrectly marked as sent (a status reserved for broadcast messages), which caused the cron job to ignore them for new subscribers.
- Subscriber Management: Standardized manual subscriber addition to reliably dispatch the SubscriberSignedUp event, ensuring all automations and initial queue synchronizations are triggered immediately.
- Autoresponder Delay: Fixed critical bug where autoresponder messages ignored the day offset and sent immediately to all subscribers. Messages now correctly respect the configured delay (day=0 for immediate, day=1 for next day, etc.).
- Subscriber Reactivation: Fixed issue where manually adding or importing subscribers who were previously unsubscribed would not reactivate them on the list.
- SMS List Permissions: Fixed an issue where team members with edit permissions were unable to edit shared SMS lists due to direct ownership checks. The SmsListController now correctly uses the canEditList() method to validate permissions.
- Vocative Case Support (Polish Names):
- New vocative column in names table for storing vocative forms.
- [[!fname]] placeholder now returns the vocative form of subscriber's first name (e.g., "Marzena" → "Marzeno").
- GenderService.getVocative() method with automatic capitalization matching.
- Name::findVocative() static method supporting user-defined and system names.
- Enhanced Polish Names Database with ~480 common, historical, and less common first names with their vocative forms (added popular diminutives like "Kasia", "Tomek", "Antek", "Zuzia", etc., and historical names like "Mieszko", "Dobrawa").

