Built around the parts that usually break
Anyone can hand a message to a gateway. The hard parts are knowing whether it arrived, not charging twice when it didn't, and being able to prove either one a month later.
Receipts you can reconcile
A message is not "sent" because the gateway accepted it. IPLSMS tracks the operator receipt and records the exact moment the handset confirmed.
- Separate sent_at and delivered_at timestamps on every message
- The operator message id stored against your record
- Terminal states pushed to your webhook, HMAC-signed
- Failures carry a reason, not just a status
"status": "delivered", "sent_at": "…T22:02:08Z", "delivered_at": "…T22:02:16Z", "jasmin_message_id": "29973d46-…"
Charged once, refunded automatically
Wallet movements are written as ledger transactions. If a message never leaves the platform, the charge comes back without you asking.
- Debit and refund recorded as separate, auditable entries
- Messages claimed atomically — never sent or billed twice
- Stale queued messages swept and refunded on a schedule
- Low-balance alerts before sending starts failing
debit sms_charge 5.85 debit sms_charge 11.70 campaign credit refund 5.85 undelivered
Opt-outs enforced at send time
Keep a per-account do-not-message list. The API refuses those recipients before the message is created or billed.
- Rejected with RECIPIENT_OPTED_OUT and no charge
- Add numbers individually or in bulk
- Applies to single sends and bulk campaigns alike
"success": false, "error_code": "RECIPIENT_OPTED_OUT"
HTTP to start, SMPP to scale
Begin with the JSON API. When volume justifies a persistent connection, move to an SMPP transceiver bind without changing how you account for anything.
- Same wallet, same message log, same receipts
- Provisioned per account with IP whitelisting
- registered_delivery = 1 returns receipts on the bind
bind_transceiver system_id "issued" port 2775
Everything else you would otherwise build
Sandbox
Send and simulate receipts without billing or touching a handset.
Request logs
Every API call made with a key, recorded for debugging.
Contacts & groups
Store recipients, group them, and target campaigns by group.
Scheduling
Queue a campaign now, let it send at a future time.
Low-balance alerts
Get told before a topped-out wallet starts refusing sends.
Sender ID review
Request IDs, track approval, and only send with approved ones.