IOSOR Learn

Inbound MO billing vs outbound MT: two-way wallet rows on one prepaid ledger

Replies, STOP, and rented-number events debit. If finance only modelled outbound, the ledger lies. A two-way product must see MO and MT in the same export, with an auto-reply cap.

The pitch talks outbound. In production the rented number receives replies, STOP, and sometimes voice callbacks, and rows appear that finance never put in the model. Inbound MO is not a free courtesy. A two-way product moves MT and MO on the same prepaid ledger. If the export only counts “sent,” finance treats inbound debit as noise until usage near USD 1,000+ makes it a commercial topic.

IOSOR is white-label prepaid: outbound and inbound on one ledger, client-safe errors, no foreign portal for day-to-day. live is two-way production; in setup is not a cheap inbox. See inbound two-way inbox guide and inbox events on rented numbers. Evidence first, then scale. Auto-reply loops: inbound auto-reply loops.

MO debits finance did not plan for

If the finance model only multiplies the MT rate, it misses MO rows on the rented number: inbound SMS, keyword acks, sometimes voice events. Those rows debit when the reply arrives, not on the marketing calendar. Product says “we are two-way”; finance asks “which row is inbound.” Without an answer there is no control. Rentals follow the UTC calendar month — setup plus prorated first period, full monthly from the next 1st — so inbound events can outlive the campaign week that funded the number.

Direction What the wallet sees What product often omits
MT outbound Send units / segments That inbound also debits
MO inbound Inbound units + keyword reply Correlation to the outbound thread
Auto-reply Another MT Loop cap

MT vs MO in the same export

Put MT and MO in the same export: time, number, direction, debit, correlation ID. Finance must filter by direction, not fold inbound into an outbound average. STOP/HELP is a compliance row and may also debit. Rented-number lifecycle binds to the inbox: releasing the number must cleanly stop inbound events, or ghost rows appear next month. Do not let a world average hide an expensive inbound corridor. A live two-way number without a direction column is a receipt printer, not a control.

Autoreply loop wallet drain

An uncapped auto-reply turns one MO into a string of MT until the wallet is empty. Bot-vs-bot, HELP that quotes the original, non-idempotent webhook retries — all drain prepaid. Cap replies per thread and treat STOP as immediate suppression. See inbound auto-reply loops.

Inbox events and correlation

The inbox is evidence, not a chat toy. Each inbound event should show number, timestamp, and a safely redacted body, and link to outbound context when there is a thread.

Red flags

  • Finance model with MT rate only
  • Export that does not distinguish direction
  • Auto-reply without a per-thread cap
  • STOP treated as chatter, no suppression
  • Agents seeing raw upstream payloads
  • Released number with inbound debits still live
  • Catalog in setup promised as two-way production

Start with IOSOR

Send one inbound MO and one outbound MT on the same rented DID. Export both wallet rows and prove they carry different reason codes. Cap the auto-reply so an inbound cannot mint unbounded MT. This is two-way prepaid row honesty, not an invoice-week mix report and not a media storage cap.

IOSOR takeaway

MO and MT share a wallet, not a line.

Do: label inbound debit separately from outbound debit. Don’t: net MO into MT or hide inbound rows until month-end.

Was this guide helpful?

Related guides