NetSendo
Platform Updates

NetSendo v2.7.2: SMS Campaigns Fixed & Security Hardening

NetSendo Team6 min read

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.

TL;DR: In v2.7.2, SMS campaigns from the panel are actually sent, either right away or at the time you schedule in your own timezone. Test SMS now shows the provider's real error message. 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 up scheduled campaigns, so nothing went out.
  • Schedule wrote your chosen date to send_at, but the cron reads scheduled_at. Scheduled SMS went out at the next cron run instead of the time you picked.
  • Queue (autoresponder) SMS saved as active stayed in sent status 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 requires contact_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/subscribers accepted 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/purchase could 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

  1. 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
  2. Re-queue stuck SMS campaigns

    SMS campaigns saved with status sent before this release are not re-sent automatically. Open each one and save it again, or click Send again.

  3. Check queue SMS

    Re-save autoresponder SMS so they are stored as scheduled and active.

  4. 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.

  5. 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.

  6. 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

1
Set your user timezone

Scheduled times are entered in your timezone and stored in UTC. Make sure your profile timezone is correct before you schedule.

2
Use one API key per account

Ownership checks now follow the API key's account. Give each client or integration its own key so access is clearly separated.

3
Set daily limits on purpose

Fallback picks another active mailbox or provider under its daily limit. Set realistic limits so traffic is spread out the way you expect.

4
Handle 404 and 422 in your code

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.

#sms#security#api#wordpress#mcp#bug-fixes#multi-tenant
Share