If you have ever wired texting into an app, you know the send call is the easy part. This walks through the parts around it that decide whether your messages actually arrive, using SMS Campaign Engine, a free MIT licensed PHP engine, as the worked example.
The Send Call Is Not the Hard Part
Every provider, Twilio, Telnyx, Vonage, Plivo and the rest, gives you an HTTP endpoint that takes a number and a body. What none of them give you is the scheduling, suppression, per carrier throttling and tracking a real broadcast needs. SMS Campaign Engine wraps twelve providers behind one send API, keeps everything in a single SQLite file, and runs on PHP 8.1 on almost any hosting, so all of that logic lives in one place you can read.
Spread Broadcasts Across the Day
The naive broadcast loops over the list and fires. Carriers treat a sudden burst from a small sender as a warning sign, and replies pile up faster than anyone can answer them. The engine instead fills a daily queue and spreads sends into hour buckets, shifting each one to the recipient's local time based on area code, so a 10 AM bucket reaches New York and Los Angeles at 10 AM local. When a broadcast has fewer slots than contacts, engaged contacts go first, using an activity level on each profile that moves from inactive to clicker to converter.
Per carrier caps sit on each list. Your 10DLC trust score limits what each network accepts from you per day, and capping volume per carrier keeps the engine under those limits instead of spending messages that get silently dropped. The step by step guide to sending bulk SMS walks through lists, caps and scheduling, including the broadcast/schedule endpoint if you want to drive it from code.
Drips Run on Relative Time, Not Calendar Time
A broadcast is one message to many people on a date you choose. A drip is many messages to one person on a schedule relative to when they enrolled, so every subscriber moves through the same sequence at their own pace. That makes the data model per enrollment: series, step, enrolled at, next due.
Enrollment comes from your signup form calling responder/create, a bulk upload, or the admin area, and the first message goes out right away when the recipient's local time allows it. Quiet hours and skip days are handled by the engine, and responder/unsub removes someone from one series without suppressing them everywhere, which is what you want when a lead converts and should move to a customer sequence. The SMS drip campaign setup guide covers the full flow, including testing a series against your own phone first.
Suppression Has to Survive Every Import
STOP handling is the requirement home grown senders most often get subtly wrong. Flagging the contact row is not enough, because the same number comes back the next time someone imports an old CSV. The engine writes every STOP to a suppression list that is checked on every send, so a number that opted out a year ago stays opted out no matter how many files get uploaded later.
Click tracking uses a per recipient placeholder link that the engine rewrites into a unique URL, so clicks are counted per subscriber and per drip step, with bots filtered out. That per step data is how you find the one message in a sequence that is driving opt outs.
Costs and Compliance in One Section
The software is free, so the real cost is the provider rate, in the US roughly half a cent to two cents per message, which puts ten thousand messages somewhere between 50 and 200 dollars. Marketing texts need prior express written consent, opt out language in every message, and 10DLC registration before carriers will pass your volume. The engine automates the mechanical parts, but consent collection and registration are still on you. The SMS broadcast software FAQ answers the rest of the common questions in short form.
The Takeaway
Sending one text is an API call. Sending ten thousand that arrive at a sensible local hour, to people who still want them, is a scheduling and bookkeeping problem, and it is worth solving once in code you can inspect rather than rebuilding it inside every app.
Top comments (0)