Skip to content
Platform

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.

Delivery

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
receipt lifecycle
"status": "delivered",
"sent_at": "…T22:02:08Z",
"delivered_at": "…T22:02:16Z",
"jasmin_message_id": "29973d46-…"
Billing

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
wallet ledger
debit   sms_charge   5.85
debit   sms_charge  11.70  campaign
credit  refund       5.85  undelivered
Compliance

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
opt-out enforcement
"success": false,
"error_code": "RECIPIENT_OPTED_OUT"
Throughput

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
smpp 3.4
bind_transceiver
  system_id  "issued"
  port       2775
Also included

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.