NetSendo v2.8.3: Safer Brain AI Sends & Smarter Goals

An AI agent that can send email campaigns needs to be reliable before it is clever. One wrong ID can mail an old newsletter to the wrong list, and a status that says "completed" when nothing was sent wears down trust quickly. You only find problems like these by running the agent in production.
That is how we found the issues fixed in NetSendo v2.8.3. While reviewing Brain on a live GOLD instance for the second time, we tested all three modes (advisory, semi-automatic and autonomous) and fixed everything that could send the wrong thing, report the wrong result or stall a goal.
latest image that could show the wrong version. Update now if you use Brain.
🚀 What's New in v2.8.3
Safe Sends
Brain only sends messages that its own plan created.
Honest Status
Failed steps are logged as failures, not as "completed".
Working Goals
Multi-step goals start right away, move forward automatically and track progress correctly.
Approve in Chat
Plan cards now include Approve and Reject buttons.
Send steps no longer touch older messages
This was the most important fix. When a planner built a plan, it filled the send step's message_id with the step number of the step that creates the message. The send step then read that number as a database ID.
{
"step": 4,
"action": "send",
"message_id": 3
}
Here, 3 meant "the message from step 3". Brain read it as "message #3 in the database". It then attached the plan's list to that older message, turned it into a broadcast and sent it. Dry-run mode did the same thing and also set that message back to draft.
Now a send or A/B step always uses the message created earlier in its own plan. A given ID is used only when a plan creates no message, and a dry run changes nothing. A/B test IDs follow the same rule. Starting a test or sending its winner no longer falls back to "the latest test".
⚠️ Important: If you ran Brain in semi-automatic or autonomous mode on an earlier version, check your recent broadcasts. Look for older messages that were unexpectedly sent or set back to draft.
No more placeholder emails
Sometimes the content step failed, or the model replied without a body. In those cases, the message step saved <p>Message content</p>, and the send step could have mailed it. Now there are three safeguards:
- The message step fails if there is no content.
- A send step doesn't run after any failed step in its plan.
- A message with an empty body or the placeholder text is never sent.
Failed steps now count as failed
Previously, results like "message not found" or a send blocked by safety checks were stored as completed, and the plan was marked successful. Now these steps are marked failed and logged as errors. A plan fails when a step that changes or sends something fails, or when every step fails. A failed read-only step won't fail a report if its other steps worked.
Chat goals that actually progress
- Advisory mode no longer opens goals. Multi-step requests get advice like any other request.
- Semi-automatic and autonomous modes start the first step immediately, either as a plan to approve or as a run. When a step's plan finishes, the next step starts on the queue. Before, this only happened if the hourly Brain cron was enabled.
- A failed step is retried once. If it fails twice, it waits for you.
- Progress counts the planned steps. A five-step goal no longer shows 100% and closes after its first plan.
- Step dependencies are compared as step numbers. Nothing new starts while a step of the goal is waiting for approval or running. Before, the chat, the queue and the cron could each open the same step.
- Goals that haven't been touched for 30 days are no longer mentioned in answers.
Approve plans directly in the chat
Plans now belong to their conversation. Chat plan cards show Approve and Reject buttons, which stay after a page reload. The result of an approved plan is posted back into the same conversation.
Automatic model fallback
Sometimes the model assigned to a task fails, for example when a free Gemini key has no quota for Gemini 2.5 Pro or a key was revoked. In that case, the call is now retried once on your main Brain model.
Other fixes
- Brain asks fewer questions. A campaign request that names the subject, content or list is planned instead of answered with a full questionnaire. Lists are shown only if the request named none, and never more than 15.
- Questions about your own offer are answered from the knowledge base. A search on the web runs only if you ask for one.
- Readable labels replace raw keys like
brain.mode.semi_auto_labelin chat, in Telegram's/modeand/statuscommands, in the model settings and in the Monitor. - The Monitor's Plans today tile now shows only today's counts.
- Reports compare only campaigns from the report's period. Opens in the trends step count each subscriber once.
- Advice, questions and plan cards in the chat now record the tokens they use.
- Fixed translations of the campaign plan report and suggested tasks.
- Docker:
:latestis now always built from the newest commit on main. A newer build cancels an older one, so an image still labeled 2.8.1 can no longer overwrite 2.8.2.
💼 Benefits & Use Cases
E-commerce: Promotional Campaigns
Say you ask Brain to "create and send a Black Friday email to VIP customers." It now:
- Sends only the message created in that plan
- Stops if the content couldn't be generated, so no placeholder email goes out
- Leaves your post-purchase sequences and old promos alone
SaaS: Multi-Step Onboarding Goals
A five-step goal such as "analyze churn, segment inactive users, draft a win-back email, A/B test it, send the winner" now moves through each step in order. It retries a failed step once and shows real progress, so the goal doesn't close early.
Agencies: Client Reporting
A "last 30 days" report now covers only campaigns from those 30 days. Open counts match the campaign statistics, so you can share reports with clients with confidence.
🛠️ Step-by-Step: Upgrading to v2.8.3
- Back up your database
Always take a backup of your database and volumes before updating a self-hosted instance.
- Pull the new image
From your NetSendo directory, run:
docker compose pull docker compose up -d - Verify the version
Check that the footer or settings show 2.8.3. If you updated to
latestaround 2026-11-08 and saw 2.8.1, that was a labeling issue. Pulling again fixes it. - Review recent broadcasts
If Brain ran send plans on an earlier version, check for older messages that were sent or set back to draft unexpectedly.
- Test with a dry run
Ask Brain for a small campaign in semi-automatic mode. Approve the plan from the chat card and watch the result appear in the conversation.
💡 Pro Tip: If you need a reproducible deployment, pin a specific version tag such as2.8.3instead oflatest.
🎯 Expert Tips
Now that you can approve plans in the chat, semi-automatic mode gives you automation while you keep control of every send.
Include the list, subject or content in your request, and Brain will plan right away instead of sending you a questionnaire.
Failures are now reported accurately, so the Monitor is a reliable place to see what needs your attention.
Make sure your main Brain model has a valid key with enough quota, because failed task models now retry on it.
Questions about your offer are answered from it, so current pricing and plan details lead to better answers.
🏁 Conclusion
v2.8.3 makes Brain safer to use in production. Sends stay inside their own plan, dry runs change nothing and failures are reported as failures. Goals move forward on their own, and approvals happen in the chat. Because NetSendo is self-hosted, your data and your AI keys stay on your infrastructure.
Read the documentation, explore integrations, or download NetSendo. If these fixes help you, please give us a star on GitHub.
Ready to Upgrade?
Update to v2.8.3 and run Brain with confidence:


