Key Takeaways
- Go bulk send loops on an Android SMS gateway API: pace HTTPS JSON to one radio. A worker pool is a host, not more throughput than the SIM.
- Hub C language spoke. Express/ASP.NET queue workers are the same physics in other runtimes.
- Confirm live fields in Developer Center. These samples are REST, not a packaged Go SDK, module product, or “complete client.”
- Accept is not delivered. Persist message ids. Do not goroutine-storm retries without idempotency.
- Priced by devices and SMS send volume. You use your own phone and operator SMS credit. Free is 300 SMS lifetime.
- Aggregator blast rates are not a handset promise. Carrier fair-use still applies.
Hub C: android sms gateway api bulk send loops in Go. Cornerstone: Android SMS gateway API. Node sibling: Express queue workers. Keys: secure API keys in env. HTTPS samples (same JSON, not a Go package): PHP examples.
Priced by devices and SMS send volume. You use your own phone and operator SMS credit.
errgroup is not a second SIM. One phone still sends one (or concatenated) SMS at a time, no matter how pretty the worker pool looks in pprof.
net/http is not a Go SMS SDK
POST JSON, Authorization Bearer, persist the id. Live path and fields: Developer Center. Do not brand this as a downloadable SDK, protobuf product, or official github.com/…/sms-gateway module we do not ship.
Goroutines are not extra SIMs
Extra devices are plan slots. Device health. OEM ceilings still apply. Load tests are staff canaries, not filter evasion. Load test carefully.
Sync loop vs worker pool
| Shape | Fits | Fails when |
|---|---|---|
| for-range + sleep | Tiny staff lists | HTTP handler holds the request open |
| Worker pool + semaphore | Campaigns with an outbox | You match GOMAXPROCS to SMS/sec |
| Unbounded goroutines | Never | Always — duplicates and a hot modem |
| Per-device queue | OTP vs promo split | Both nicknames point at one phone |
DLR: API delivery reports.
Idempotency before retry
Transport errors retry with backoff. Permanent rejects do not. Use the idempotency mechanism documented in Developer Center so a panicked worker does not double-spend the operator.
Do not bulk the OTP device
OTP priority queue and OTP verification. The bulk loop is a named nickname, not “whatever is online.”
A tight loop spends airtime
Priced by devices and SMS send volume. You use your own phone and operator SMS credit. Platform volume counts every accepted send. Twilio-style cloud blast is a different bill. Twilio vs Android SMS gateway.
Shape of a paced POST
Illustrative only — confirm path and JSON in Developer Center. Not a module you import as a product:
req, _ := http.NewRequest(http.MethodPost, sendURL, body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SMS_GATEWAY_TOKEN"))
req.Header.Set("Content-Type", "application/json")
// acquire per-device semaphore, then client.Do(req)
// store response id; do not treat 200 as deliveredChecklist
- Outbox before HTTP.
- Semaphore per device.
- Key in env, not the job struct.
- Idempotency on send.
- Message id stored.
- OTP radio excluded.
- Canary staff MSISDNs first.
- No Go SDK branding.
- Developer Center checked.
- Airtime budget written.
Next steps
Mirror Express workers in Go, then pricing. The compiler is fast. The SIM is not.
Related product pages
Jump to the live product docs for this topic—not another long-form article.
- bulk SMS from Excel and CSVSpreadsheet campaigns
- bulk SMS with consent best practicesHigh-volume outreach
- SMS API documentationLive endpoint reference
- device and SMS volume pricingPlans and allowances




