NetSendo v2.7.2: SMS Campaigns Fixed & Security Hardening
Picture this: you write a carefully timed SMS for a flash sale, click Send now, and watch the campaign switch to "sent". Your customers never get a single message. For NetSendo users who sent SMS from the panel, that was happening every time, and nothing on screen showed it.
NetSendo v2.7.2 fixes this. It also repairs test SMS, the send_sms MCP tool for AI assistants and the WordPress plugin. And it closes three gaps where one user's data or sending accounts could cross into another user's account on a shared instance.
POST /api/v1/sms/send accepts content or message, and the WordPress plugin 1.1.2 can add people to lists again. Fallback mailboxes and SMS providers, API tags and purchase webhooks now stay within the account that owns them. To upgrade, run docker compose pull && docker compose up -d. There are no migrations.
🚀 What's New in v2.7.2
SMS That Actually Sends
Panel campaigns are now saved the same way email campaigns are, with status scheduled and a proper scheduled_at.
Honest Test SMS
If the provider rejects a test SMS, you see the provider's error instead of a false "Test SMS sent".
Working MCP send_sms
AI assistants can send SMS through the API without getting a 422 error.
Account Isolation
Mailboxes, SMS providers, tags and contacts can no longer be used across accounts.
SMS Campaign Scheduling, Rebuilt
Before this release there were three separate bugs. Think of them as three doors that were all locked.
- Send now saved the campaign as
sent. The SMS cron only picks upscheduledcampaigns, so nothing went out. - Schedule wrote your chosen date to
send_at, but the cron readsscheduled_at. Scheduled SMS went out at the next cron run instead of the time you picked. - Queue (autoresponder) SMS saved as active stayed in
sentstatus and never ran.
Now "Send now" saves the campaign as scheduled with scheduled_at set to the current time. "Schedule" takes the time in your timezone and stores it in UTC. Queue SMS are saved as scheduled and active. The edit form shows the scheduled time in your timezone.
Test SMS and the SMS API
The "Send test SMS" button passed message: to the SMS providers, but they expect content:. That mistake caused a PHP error that the catch (\Exception) block didn't catch. It's fixed now.
POST /api/v1/sms/send had the opposite problem: the MCP client sent content, but the endpoint required message, so it returned 422. The endpoint now accepts both field names, and a subscriber_id is enough on its own:
curl -X POST https://your-netsendo.example.com/api/v1/sms/send \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"subscriber_id": 42, "message": "Your order has shipped!"}'
Error responses are clearer too. A subscriber that belongs to another account returns 404. A phone number that no contact has returns 422 instead of 500.
WordPress Plugin 1.1.2
Plugin 1.1.2 fixes two problems:
- The plugin sent
list_id, but the API requirescontact_list_id. Every signup and content-gate unlock failed. - "Subscribers only" gates treated the single subscriber returned by the API as a list, so they never recognised anyone.
You can download 1.1.2 under Marketplace → WordPress → Download Plugin. Sites with the plugin already installed are offered the update.
Security Fixes
When the default mailbox or SMS provider couldn't be used, NetSendo looked for another active one with this raw condition. The parentheses were missing:
// Before: the OR escaped the user condition
->whereRaw('daily_limit IS NULL OR sent_today < daily_limit')
// After: the condition is grouped
->whereRaw('(daily_limit IS NULL OR sent_today < daily_limit)')
Because of this, a campaign could go out through another user's mailbox or SMS account. Two more API endpoints also checked ownership too loosely:
POST /api/v1/subscribersaccepted tag IDs from other accounts. Tags must now belong to the API key's account, which was already the rule for lists.POST /api/webhooks/purchasecould match a contact's email in any account. Now it only searches the API key's account.
⚠️ Important: If several users or clients share your NetSendo instance, install this update as soon as possible. The fallback bug could send one tenant's campaign through another tenant's mailbox or SMS account.
💼 Benefits & Use Cases
E-commerce: Timed SMS Promotions
You can schedule a weekend flash-sale SMS for Saturday 9:00 in your local time, and it goes out at 9:00, not whenever the next cron run happens. Autoresponder SMS for abandoned carts and post-purchase follow-ups now run as they should.
SaaS: AI-Assisted Messaging
Your support team can ask an AI assistant connected over MCP to "text subscriber 42 that their trial ends tomorrow", and the message is delivered. Because subscriber_id alone is enough, the assistant doesn't need to look up a phone number first.
Agencies: Safe Multi-Tenant Setups
If you run one instance for many clients, each client's campaigns now stay on that client's own mailboxes and SMS providers. Tags and purchase webhooks are limited to the account they belong to. Your data stays separated on hardware you control.
🛠️ Step-by-Step Upgrade Guide
- Pull and restart
Run the commands below. No configuration files change, and there are no migrations since 2.7.1.
docker compose pull && docker compose up -d - Re-queue stuck SMS campaigns
SMS campaigns saved with status
sentbefore this release are not re-sent automatically. Open each one and save it again, or click Send again. - Check queue SMS
Re-save autoresponder SMS so they are stored as
scheduledand active. - Send a test SMS
Send a test to your own number. If the provider rejects it, you'll now see the real error, such as a sender ID or credit problem.
- Update the WordPress plugin
Accept the 1.1.2 update in WordPress, or download it from Marketplace → WordPress → Download Plugin. Then test one signup form and one content gate.
- Review API integrations
If your scripts send tag IDs from other accounts or rely on matching purchases across accounts, those calls will now fail or find no contact. Update them to use IDs from the API key's own account.
ℹ️ Note: Before re-queuing old campaigns, check that their content is still relevant. A promotion that has already expired should be edited or deleted, not sent.
🎯 Expert Tips
Scheduled times are entered in your timezone and stored in UTC. Make sure your profile timezone is correct before you schedule.
Ownership checks now follow the API key's account. Give each client or integration its own key so access is clearly separated.
Fallback picks another active mailbox or provider under its daily limit. Set realistic limits so traffic is spread out the way you expect.
Treat a 404 from the SMS API as "not your subscriber" and a 422 as "unknown number". Log these for review instead of retrying.
✅ Conclusion
v2.7.2 fixes SMS for panel campaigns, test sends, the API and the MCP tool. It brings back WordPress signups and content gates, and it tightens account isolation for shared instances. The release ships with new tests: SmsCampaignSchedulingTest, SmsSendApiTest, ProviderFallbackOwnerScopeTest and ApiAccountScopeTest.
Upgrade to v2.7.2 Today
Pull the new image, re-queue any stuck SMS campaigns, and you're done. Read the documentation or browse the integrations. If NetSendo saves you time, please give the project a ⭐ on GitHub.



